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 を介して挿入を強制することもできますが、これも理想的な状況ではありません。ここで正しい方法についてアドバイスを求めてください。