次のような状況があります。
同じテーブルを持つ 1 つのデータベースに同じテナントを持つマルチテナントのアプリケーションを構築しようとしています。ご存知のように、私が見つけたように、Hibernate は 5.0 より前にこのバリアントをサポートしていません。
すべてのテーブルに brandId フィールドを追加して、これを解決しようとしています。
多対多の関係を構築するときに、この brandId を ManyToMany 結合テーブルに追加し、ここで (これができるかどうかわかりません。mysql は文句を言っていません)、両方のテーブルに外部キーを作成しましたが、どちらにもブランド ID が含まれています
たとえば、テーブル Text(ID,name,brandId) と Tag(ID,name,brandId) と結合テーブル (text_id,tag_id,brand_id) があり、外部キーは
CONSTRAINT FK_TAG_TEXTS_TAG FOREIGN KEY (TAG_ID,BRAND_ID) REFERENCES TAG (ID,brand),
CONSTRAINT FK_TAG_TEXTS_TEXT FOREIGN KEY (TEXT_ID,BRAND_ID) REFERENCES TEXT (ID,brand)
ご覧のとおり、ブランド ID が 2 回使用されています。
次に、Hibernate Tools を使用してクラスを生成しました。これにより、必要に応じて複合主キー クラスが作成され、タグ クラスに関連付けが作成されました。
@ManyToMany(fetch = FetchType.EAGER,cascade = {CascadeType.PERSIST,CascadeType.MERGE })
@JoinTable(name = "tag_texts", , joinColumns = {
@JoinColumn(name = "TAG_ID", nullable = false, insertable = false, updatable = false),
@JoinColumn(name = "BRAND_ID", nullable = false, insertable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "TEXT_ID", insertable = false, nullable = false, updatable = false),@JoinColumn( name = "BRAND_ID", insertable = false, nullable = false, updatable = false) })
public List<Text> getTexts() {
return this.texts;
}
問題は、次の例外が発生することです。
org.hibernate.MappingException: コレクションのマッピングで繰り返される列: de.company.domain.Tag.texts 列: brand_id
例外を発生させる Collection クラスの Hibernate コードを調べました。ここで、Set を使用して名前を挿入する「checkColumnDupliation」メソッドが呼び出されます。これは、「BRAND_ID」を列として 2 回目に挿入すると、この動作が発生することを意味します。
繰り返し列エラーの最も一般的な解決策は、複数の参照で同じ列を使用するときに「挿入可能 = false および更新可能 = false」を挿入することです。これについては、次の場所で説明されています:
Hibernate: 外部キーを含む複合主キー コンステレーションのどこに挿入可能 = false、更新可能 = false が属しますか?
しかし、これは私のものと同じ問題ではないようです。
私の質問は次のとおりです。JPAアノテーションでこれを修正し、joinColumnsとinverseJoinColumnsの両方でブランドIDを使用する可能性はありますか?