了解hibernate中的多对多映射

时间:2014-05-20 21:22:25

标签: java hibernate

我指的是示例 - http://viralpatel.net/blogs/hibernate-many-to-many-annotation-mapping-tutorial/ 员工可以参加许多会议和会议 很多员工都可以参加。

让拥有者成为员工。 Employee中的多对多映射代码将是 -

@ManyToMany(cascade = {CascadeType.ALL})  
@JoinTable(name="EMPLOYEE_MEETING",   
            joinColumns={@JoinColumn(name="EMPLOYEE_ID")},   
            inverseJoinColumns={@JoinColumn(name="MEETING_ID")})  
private Set<Meeting> meetings = new HashSet<Meeting>();  

我查看了其他几个示例和文档,但我仍然不确定这是如何工作的。我不认为我完全理解joinColumns和inverseJoinColumns的作用。

joinColumns={@JoinColumn(name="EMPLOYEE_ID")} - 这行只告诉hibernate 员工的员工ID加入映射表的员工ID?

inverseJoinColumns={@JoinColumn(name="MEETING_ID")})?这行只告诉hibernate将Employee id加入链接表中的Meeting_Id列吗?

1 个答案:

答案 0 :(得分:2)

实际注释的含义是Hibernate应该创建一个中间连接表。此表的一列应映射到EmployeeEmployee_ID上的列(joinColumns参数),另一列应映射到您的列上的列名为Meeting的{​​{1}}表格(即Meeting_ID参数)。

inverseJoinColumns参数应指定拥有实体的PK(在本例中为Employee对象),而joinColumns指定非拥有实体的PK。

请注意,您不必总是将您的加入列指定为PK,但这是有道理的,因为强制执行唯一性以及它的PK点。您还可以在连接表中的关系的任一侧创建多个连接列。

您似乎已经掌握了如何建立关系,但我会这样说是为了Google从这里来的人们的利益。在双向关系中,您必须指定关系的哪一方拥有&#39;关系。虽然您也可以使用双向级联,但通常只能通过拥有对象来访问非拥有对象。因此,您通常不会直接访问inverseJoinColumn对象,而是通过Meeting对象访问它。这在单向关系中变得更加重要,但在确定要级联的内容时,它会在双向关系中引起一些问题。

例如,如果您决定删除Employee,则不希望删除级联到联接表,则需要更改Meeting CascadeType 1}} class。

如果您希望我扩展我的解释,请告诉我。