我找到了一个可行的解决方案。正如我之前提到的,我不允许修改 Vehicle 和 Weapon 实体以及相应的映射文件。甚至不允许使用单个注释。
我通过谷歌搜索 Ben 的建议找到了这个答案,这让我找到了这些文章:
http ://www.mkyong.com/hibernate/hibernate-one-to-one-relationship-example/
和http://www.vaannila.com /hibernate/hibernate-example/hibernate-mapping-one-to-one-1.html
mkyong 的建议很好,但我不喜欢同时保留和分配主键的想法,因为我无法编辑 Vehicle 和 Weapon 类的映射文件。请参阅评论“一对一关系的主要困难是确保两者都分配了相同的主键”
vaannila 的建议在某种程度上很有趣。它具有一对一的关系,但不需要对其他映射文件进行任何编辑。
首先,我声明了我的 VehicleWeapon.hbm.xml 如下:
<hibernate-mapping package="com.armory">
<id name="id" type="long" >
<column name="id" />
<generator class="native" />
</id>
<many-to-one name="vehicle" class="Vehicle"
column="vehicle_column" cascade="all" unique="true" />
<many-to-one name="weapon" class="Weapon"
column="weapon_column" cascade="all" unique="true" />
然后我声明了我的标准 VehicleWeapon POJO 类。以及相应的DAO实现。
我运行了几个 Junit/Spring 测试。我能够毫无问题地保存、删除、检索。所有动作级联到相应的武器和车辆表。
此方法的唯一缺点是 Hibernate 将创建第三个表 vehicle_weapon ,其中分别包含车辆和武器表的 id 作为参考。
好消息是我没有编辑任何现有实体或映射文件。我创建了一个新对象并从两个表中组合了一个新对象。
我仍然希望能够直接映射到武器和载具的属性,而不是直接映射到武器和载具实体。但就目前而言,我认为这是可以接受的。