1

Web アプリケーションに Hibernate を使用しており、リバース エンジニアリングを使用してマッピング、モデル、および DAO クラスを作成しています。

私の DB では、すべてのテーブルに tenantId と 1 つの追加のキー フィールドが複合 PK として含まれています。私はいくつかのFK関係を持っています。したがって、すべての FK リレーションは両方のフィールド (つまり、複合キー) にマップされます。

生成された結果のマッピング ファイルには、次の多対 1 マッピングがあります。

<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 の主キーです。

ご覧のとおり、更新と挿入が false に設定されているため、テーブル 1 にデータを挿入しようとすると、propXId がテーブル 1 に挿入されません。

update および insert 属性を「true」に変更しようとすると、休止状態でマッピング エラーがスローされ、次のメッセージが表示されます。

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