@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 正在更新现有行,因为值相同 (??)。我尝试为复合键插入不同的值,它在子表中插入很好。
我希望我试图让你正确理解这个问题。两个表之间存在单向的一对多关系,其中更新发生在具有相同值的行上。
我很困惑是一对多还是复合键的问题。