【问题标题】:Understanding many to many mapping in hibernate了解hibernate中的多对多映射
【发布时间】:2014-05-20 21:22:24
【问题描述】:

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

让拥有类为 Employee。 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")} - 这行是否只告诉休眠 那个雇员的雇员id加入映射表的雇员id?

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

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    实际注释的意思是 Hibernate 应该创建一个中间连接表。此表的一列应映射到 Employee 表上名为 Employee_ID 的列(这是您的 joinColumns 参数),另一列应映射到 Meeting 表上名为 Meeting_ID 的列(即你的inverseJoinColumns 参数)。

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

    请注意,您不必总是将连接列指定为 PK,但这是有道理的,因为强制执行唯一性及其类型的 PK。您还可以让多个连接列在连接表中的关系的任一侧形成一个复合键。

    您似乎对如何建立关系有所了解,但我会这样说是为了让来自 Google 的人们受益。在双向关系中,您必须指定关系的哪一方“拥有”关系。虽然您也可以拥有双向级联,但您通常只能通过拥有对象访问非拥有对象。因此,您通常不会直接访问 Meeting 对象,而是通过 Employee 对象访问它。这在单向关系中变得更加重要,但在确定您想要级联的内容时,它可能会在双向关系中导致一些问题。

    例如,如果您决定在删除 Meeting 时不希望删除级联到连接表,则需要在 Meeting 类中更改 CascadeType

    如果您希望我进一步解释我的解释,请告诉我。

    【讨论】:

    • 谢谢詹姆斯。似乎inverseJoinColumns 只是用词不当,没有任何东西被倒置。对吗?
    • 是的,没有什么是反转的,它只是映射的反面
    • 谢谢詹姆斯。顺便说一句,J2EE 是您大学课程的一部分吗?
    • 不是真的,我是在最后一年与最终雇用我的公司一起做一个行业项目时学到的。
    • 主要是 Spring 和 Hibernate,带有一点 JSP,但我更喜欢带有 jQ​​uery 的 RESTful HTML。我对 Spring 和 Hibernate 相当信任,与在 uni 相比,当你每天都被这些技术所包围时,你会学到很多东西。
    猜你喜欢
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 2011-05-18
    相关资源
    最近更新 更多