【问题标题】:Hibernate: More than one relationship using the same join columnHibernate:使用同一连接列的多个关系
【发布时间】:2011-01-16 21:02:06
【问题描述】:

我正在使用带有复合键的旧数据库模式。我有一个具有两个关系的实体,并且其中一个连接列是共享的。

例如,假设我有一个 Student 实体,它有两个关系 Department 和 Course。 Department 使用 dept_code 列,而 Course 使用 dept_code 和 course_code 列。领域模型是这样的,学生可能属于一个系,但尚未选择课程,或者学生可能同时选择了系和课程。这是休眠映射的样子:

<many-to-one class="Department" name="department">
  <column name="dept_code"/>
</many-to-one>

<many-to-one class="Course" name="course>
  <column name="dept_code"/>
  <column name="course_code"/>
</many-to-one> 

问题是 Hibernate 不允许这种映射,除非其中一个关系使用 insert=false 和 update=false 标记为只读。

有没有办法让两个关系都可写?

【问题讨论】:

    标签: java database hibernate orm jdbc


    【解决方案1】:

    你可以试试下面的

    1) 在 dept_code 上设置非空属性,看看会发生什么(可以接受吗?)

    2) 将部门设置为只读,课程设置为写入,在setDepartment中创建一个课程对象,现有课程代码的course_code为空,并实际使用setCourse,看看更新是否正常?

    【讨论】:

      【解决方案2】:

      我了解到您有一个旧数据库,因此可能无法更改表?但如果可能的话,我会插入一个代理键或一个新的连接表。

      如果您没有该选项,您始终可以编写自己的加载和持久化 SQL。看看 映射元素。 请参阅https://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/querysql.html 第 13.3 章。和关注。

      作为第三种选择,您可以只映射没有该连接的实体并自己执行 CRUD 方法:自己编写加载、保存、更新和持久化方法并手动处理实体之间的连接。这可以对您的客户端代码透明地完成。调用者将只使用 setDepartment 和 getDepartment 方法,而您的 DAO(或您正在使用的任何其他概念)将处理其余部分。

      顺便说一句:Manning 的 JPA/Hibernate 书中有一章对这类问题很有帮助(“Java Persistence with Hibernate”第 8 章 - Legacy Databases and custom SQL)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-15
        • 2015-05-21
        • 2021-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多