質問には@ManyToMany without join table (legacy database)と同様の問題があり、その他の問題があります。複数列の主キー(ID
とID3
)と多対多の関係を持つ読取り専用データベースを結合テーブルなしでマッピングする
Iが複数列の主キー(ID
とID2
)を持つ2つのテーブルA
とB
A
を有するB
A
の行は、B
(B.ID = A.ID
)、B
の行は、A
の複数行で参照できます。
EDIT:このデータベースは、私が変更できない読み取り専用のレガシーデータベースです。私はJPAとの関係をマップする必要はありません(追加の選択肢を使って自分のプログラムロジックで行うこともできます)が良いでしょう。
基本的には、結合テーブルを使用しない多対多の関係です。リンクされた質問については、テーブルを読むだけで済むので、私は両方のクラスで2対1の関係を試しました。
追加の問題は、結合に使用されるID
の両方が主キーではないということです。
私は次のクラスがあります。B.id
はA
で単一のプロパティを参照している(A.id
):私は本当にメッセージを取得しない
Exception while preparing the app : referencedColumnNames(ID) of package.B referencing package.A not mapped to a single property
:
@Entity
@Table(name = "A")
@IdClass(PrimaryKeysA.class)
public class A {
@Id
@Column(name = "ID", insertable = false, updatable = false, columnDefinition = "char")
private String id;
@Id
@Column(name = "ID2", insertable = false, updatable = false)
private int id2;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "ID", columnDefinition = "char", referencedColumnName = "ID")
private Set<B> setOfBs;
}
@Entity
@Table(name = "B")
@IdClass(PrimaryKeysB.class)
public class B {
@Id
@Column(name = "ID", insertable = false, updatable = false, columnDefinition = "char")
private String id;
@Id
@Column(name = "ID3", insertable = false, updatable = false)
private int id3;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "ID", columnDefinition = "char", referencedColumnName = "ID")
private Set<A> setOfAs;
}
Hibernateは次のエラーが発生します。
EDIT:要求としては:
public class PrimaryKeysA implements Serializable {
private static final long serialVersionUID = 1L;
private int id1;
private int id2;
// getters/setters/equals/hashcode
}
PrimaryKeysB
ID3の代わりID2と同様です。 A
とB
の両方のクラスは、簡略化された(匿名化された)例です。
これらのテーブルで多対多を使用する方法は実際にはわかりません。 A.IDはB.IDを参照し、B.IDはBの主キーです。 AからBへのManyToOneの関連付けがあります。 –
Ooopsは申し訳ありません。私はBと同じAを持っています。私は質問を編集します(私は単純化した例も生成しようとしましたfar) – Matteo
これは2つのテーブル間の多対多の関連ではありません...なぜ各テーブルで2つのIDを使用していますか?このスキーマをより標準的な形式に変更できますか、これは従来のデータベースですか?レガシーデータベースでない場合は、多対多の関連付けが必要な場合は、結合テーブルを使用しない理由は何ですか? –