6

次のような状況があります。

同じテーブルを持つ 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を使用する可能性はありますか?

4

1 に答える 1