我将 Hibernate 用于我的 Web 应用程序,并使用逆向工程来创建我的映射、模型和 DAO 类。
在我的数据库中,所有表都有tenantId 和一个额外的关键字段作为复合PK。我有一些 FK 关系。因此,所有外键关系都映射到两个字段(即复合键)上。
生成的结果映射文件具有以下多对一映射
<hibernate-mapping>
<class name="table1" table="table1" catalog="x">
<composite-id name="id" class="tbl1Id">
<key-property name="prop1Id" type="int">
<column name="prop1Id" />
</key-property>
<key-property name="tenantId" type="int">
<column name="tenantId" />
</key-property>
</composite-id>
<many-to-one name="table2" class="table2" update="false" insert="false" fetch="select">
<column name="propXId" />
<column name="tentantId" not-null="true" />
</many-to-one>
....
propXId 和 TenantId 是 table2 的主键。
如您所见,update 和 insert 设置为 false,因此当我尝试将数据插入 table1 时,propXId 不会插入 table1。
当我尝试将更新和插入属性更改为“真”时,休眠会引发映射错误,并显示以下消息
..Repeated column in mapping for entity: table1 column: TenantId (should be mapped with insert="false" update="false") ..
据我了解,由于 TenantId 已经是 table1 PK 的一部分,因此无法再次添加。但正因为如此,它也没有插入 propXid。在我看来,这是不对的。
TenantId 只是为了处理 Multitancy,但真正的关系在 propXid 上。但是添加tenantId 似乎会导致Insert 出现这个问题。
请让我知道是否有解决此映射的方法。否则我能想到的唯一其他方法是从 PK 中删除 TenantId,这意味着我的所有 prop1Id 和 propXid 在所有租户中都必须是唯一的。这对我来说不是一个好的解决方案。
或者我可以在通过代码检查 FK 之后通过 HQL/SQL 强制插入,这也不是理想的情况。就这里的正确方法寻求您的建议。