1
@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対多の問題なのか複合キーの問題なのか混乱しています。

4

0 に答える 0