使用Java Persistence API(JPA)时,通常需要在两个实体之间创建关系。 这些关系是通过使用外键在数据模型(例如数据库)中定义的,而在我们的对象模型(例如Java)中则使用注释来定义关联,以定义关联。 在对象模型中定义关系或关联时,一项常见的任务是识别关系的拥有方。 标识关系中的拥有实体很重要,因为拥有方通常是(如果不是总是)必须在@JoinColumn批注中指定的地方。 为了说明实体拥有方的概念,我们将使用数据模型来支持此讨论。
让我们分析这个简单的模型,该模型描述了两个表POST和SERIES之间的关系。 在这种关系中,POST表存储一个博客帖子,该博客帖子可以是SERIES表代表的一系列帖子的一部分。 在数据模型中,POST表上的SERIES_ID外键将POST与相应的SERIES关联。 此外键指示哪个实体拥有该关系。 让我们在对象模型中添加这些实体,并在它们之间建立简单的单向关系。 一,系列实体:
@Entity
@Table(name="SERIES")
public class Series {@Id@GeneratedValue(strategy=GenerationType.AUTO)@Column(name="SERIES_ID")private Integer seriesId;@Column(name="TITLE")private String title;//Accessors...
}
和Post实体:
@Entity
@Table(name="POST")
public class Post {@Id@GeneratedValue(strategy=GenerationType.AUTO)@Column(name="POST_ID")Integer postId;@Column(name="TITLE")String title;@Column(name="POST_DATE")Date postDate;@ManyToOne@JoinColumn(name="SERIES_ID")private Series series;//Accessors...
}
在Post实体中,在字段系列上方指定@JoinColumn批注,以表示用于标识帖子的各个Series的外键。 @JoinColumn批注放置在Post实体上,因为它是关系中的拥有实体。 通过引用数据模型中的两个实体并标识包含外键的实体来确定实体的拥有方。 如果Post和Series实体之间的关系要求是双向的,则意味着Post实体应该可以从Series进行访问,则关系(Series)的反面必须使用@OneToMany进行注释,并定义了mappingBy元素。 mappingBy元素应指向关系(Post)的拥有方的字段,该字段指定用于关联实体的@JoinColumn。
Series实体的以下重构突出显示了用于建立双向关系的映射:
@Entity
@Table(name="SERIES")
public class Series {@Id@GeneratedValue(strategy=GenerationType.AUTO)@Column(name="SERIES_ID")private Integer seriesId;@Column(name="TITLE")private String title;@OneToMany(mappedBy="series")private List posts = new ArrayList();//Accessors...
}
总之,在JPA持久性单元内定义的关系中确定拥有实体时,重要的是查阅数据模型以查找数据模型中的各个表中哪些实体包含外键。
翻译自: https://www.javacodegeeks.com/2013/04/jpa-determining-the-owning-side-of-a-relationship.html