@Entity
@Table(name="table1")
public class Parent{
@Id
@Column(name="Parentid")
private String Parentid;
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@JoinColumn(name="Parentid" referencedColumnName="Parentid")
private List<Child> objChild;
.....//getters and setters
}
子は複合主キーを使用します。そのためのコードは次のとおりです。
@Embeddable
public class ChildPk{
@Column(name="...")
private String str1;
@Column(name="...")
private String str2;
.....//getters and setters
}
@Entity
@Table(name="table2")
public class Child{
@Column(name="Parentid", nullable="false")
private String Parentid; //this the foriegn key referencing Entity1
@EmbeddedId
private ChildPk objChildPk;
.....//getters and setters
}
上記のコードのように、親と子の 1 対多の関係があります。また、Child には複合キーが主キーとして含まれています。
Child に複合キーを設定し、それを Parent に追加し、Parent に設定し、session.save() で Parent を保存します。これにより、Child で挿入ステートメントが正常に実行されます。同じように、別の Child オブジェクトを挿入しようとしても、以前と同じ複合キーを含み、外部キーが異なり、Parent オブジェクトを再度保存しようとすると、実際には Child の既存の行が新しい Parentid で更新されます。
リレーショナル データベースによると、私の理解では、Child テーブルの複合キーの重複エントリは挿入に失敗するはずです。しかし、値が同じ (??) ため、Hibernate は既存の行を更新しています。複合キーに異なる値を挿入しようとしましたが、子テーブルにうまく挿入されました。
問題を正しく理解できるように努めていることを願っています。同じ値を持つ行で更新が行われる 2 つのテーブル間には、単方向の 1 対多の関係があります。
1対多の問題なのか複合キーの問題なのか混乱しています。