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