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
}

Child 使用复合主键。代码是:-

@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
}

根据上面的代码,我有一个父子一对多的关系。Child 包含一个复合键作为其主键。

我使用复合键填充子项,将其添加到父项,填充父项,并使用 session.save() 保存父项。这对 Child 成功执行了 insert 语句。同样,如果我尝试插入另一个 Child 对象,但包含与之前相同的复合键但不同的外键,然后尝试再次保存 Parent 对象,它实际上会使用新的 Parentid 更新 Child 中的现有行。

根据关系数据库,我的理解是子表中复合键的重复条目应该无法插入。但是,Hibernate 正在更新现有行,因为值相同 (??)。我尝试为复合键插入不同的值,它在子表中插入很好。

我希望我试图让你正确理解这个问题。两个表之间存在单向的一对多关系,其中更新发生在具有相同值的行上。

我很困惑是一对多还是复合键的问题。

4

0 回答 0