JPA实体关系的方向

时间:2014-02-04 14:55:08

标签: java jpa

我是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不知道它具有哪些订单项?

2 个答案:

答案 0 :(得分:2)

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

<强>单向

@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;
}

正如您所看到的,单向关系不允许孩子访问父级,而双向允许父级访问。此链接是通过向父类型的子项添加带注释的字段来创建的,并且是完全可选的。它归结为一项设计决定。

当然,数据库必须支持这种关系,这意味着建立了正确的主键/外键来链接表,但数据库中不需要特殊

在建模这些关系时要注意的一个重要概念是拥有实体。我已就这个可能有用的主题写了article

答案 1 :(得分:0)

这取决于您的要求

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...

}