繁体   English   中英

JPA实体关系指导

[英]JPA direction of entity relationships

我是JPA的新手,在理解“实体关系方向”概念时遇到一些困难,如下所述:

http://docs.oracle.com/javaee/7/tutorial/doc/persistence-intro001.htm#BNBQI

是在设计实体时选择单向性还是双向性,还是由数据库模式提供? 就像在顺序应用程序( http://docs.oracle.com/javaee/7/tutorial/doc/persistence-basicexamples001.htm ),你能不能例如设计它,以便lineitem知道哪些订单是属于,但order不知道它有哪些order

您可以通过在实体上包括的字段和注释来确定关系是单向还是双向。

单向

@Entity
public class Parent(){

    @OneToMany
    private List<Child> children;
}

@Entity
public class Child(){

}

双向

@Entity
public class Parent(){

    @OneToMany
    private List<Child> children;
}

@Entity
public class Child(){

    @ManyToOne
    @JoinColumn
    private Parent parent;
}

如您所见, 单向关系不允许子级访问父级,而双向关系则允许父级访问。 该链接是通过将注释字段添加到父类型的子对象来创建的,并且是完全可选的。 它归结为一个设计决策。

当然,数据库必须支持该关系,这意味着将建立适当的主键/外键来链接表,但是数据库中不需要任何特殊的东西。

建模这些关系时要注意的一个重要概念是拥有实体。 我写了这篇有关该主题的文章 ,这可能会有所帮助。

那取决于你的要求

Unidirectional

@Entity
@AutoProperty
public class OneToOneUnidirectionalA implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

    @OneToOne
    private OneToOneUnidirectionalB b;

    private String s;

    // Setters, Getters, Constructors, Pojomatic...

}


@Entity
@AutoProperty
public class OneToOneUnidirectionalB implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

    // No reference to OneToOneUnidirectionalA
    // since this is a unidirectional relationship

    private String s;

    // Setters, Getters, Constructors, Pojomatic...

}

双向A拥有该关系。 我们还需要避免Pojomatic循环引用问题:

@Entity
@AutoProperty
public class OneToOneBidirectionalA implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

    @Property(policy=PojomaticPolicy.NONE)
    @OneToOne
    private OneToOneBidirectionalB b;

    // Setters, Getters, Constructors, Pojomatic...

}



@Entity
@AutoProperty
public class OneToOneBidirectionalB implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

    @Property(policy=PojomaticPolicy.NONE)
    @OneToOne(mappedBy="b")
    private OneToOneBidirectionalA a;

    // Setters, Getters, Constructors, Pojomatic...

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM