1

我将 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 强制插入,这也不是理想的情况。就这里的正确方法寻求您的建议。

4

0 回答 0