我正在使用带有复合键的旧数据库架构。我有一个有两个关系的实体,其中一个连接列是共享的。
例如,假设我有一个学生实体,其中有两个关系系和课程。部门使用dept_code列,而课程使用dept_code和course_code列。域模型是这样的,学生可能属于某个部门而没有选择课程,或者学生可能选择了部门和课程。这就是hibernate映射的样子:
<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将其中一个关系标记为只读。
有没有办法让两个关系都可写?
答案 0 :(得分:1)
您可以尝试以下
1)在dept_code上设置not-null属性,看看会发生什么(可以接受吗?)
2)将部门设置为只读且要写入的课程,并在setDepartment中创建一个课程对象,其课程代码为course_code null,并实际使用setCourse并查看更新是否正常?
答案 1 :(得分:1)
我知道您有遗留数据库,因此可能无法更改表格?但如果可能的话,我会插入一个代理键或一个新的连接表。
如果您没有该选项,则始终可以编写自己的加载并持久化SQL。看看&lt; loader&gt;,&lt; sql-insert&gt;,&lt; sql-delete&gt;和&lt; sq-update&gt;映射元素。 见https://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/querysql.html第13.3章。以及。
作为第三个选项,您可以在没有该连接的情况下映射您的实体并自己执行CRUD方法:自己编写加载,保存,更新和持久化方法,并手动处理实体之间的连接。这可以通过您的客户端代码完成。调用者只需使用setDepartment和getDepartment方法,你的DAO(或你正在使用的任何其他概念)将处理其余的。
Btw:Manning的JPA / Hibernate Book中有一个有用的章节,介绍了这类问题(“Java Persistence with Hibernate”第8章 - 旧数据库和自定义SQL)。