Java 休眠:使用同一联接列的多个关系

Java 休眠:使用同一联接列的多个关系,java,database,hibernate,orm,jdbc,Java,Database,Hibernate,Orm,Jdbc,我使用的是带有复合键的遗留数据库模式。我有一个具有两个关系的实体,其中一个连接列是共享的 <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"/> <co

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

<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映射的外观:

<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> 

<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> 


你能试试下面的吗

<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> 
1) 在dept_代码上设置NOTNULL属性,看看会发生什么(可以接受吗?)

<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> 

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

我知道您有一个遗留数据库,因此可能无法更改表?但如果可能的话,我会插入一个代理键或一个新的联接表

<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> 
如果您没有这个选项,您总是可以编写自己的加载和持久化SQL。看看映射元素。 见第13.3章。并紧随其后

<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> 
作为第三个选项,您可以只映射实体而不使用该连接,自己执行CRUD方法:自己编写加载、保存、更新和持久化方法,并手动处理实体之间的连接。这可以在你的客户代码上做。调用方将只使用setDepartment和getDepartment方法,而DAO(或您正在使用的任何其他概念)将处理其余部分

<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> 
顺便说一句:在JPA/Hibernate的书中,Manning有一章对这类问题很有帮助(“Hibernate的Java持久化”第8章-遗留数据库和定制SQL)

<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>