@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包含一个Composite键作为其主键。
我使用复合键填充Child,将其添加到Parent,填充Parent,并使用session.save()保存Parent。这个成功执行插入语句在Child上。同样的方法,如果我尝试插入另一个Child对象,但包含与之前但不同的外键相同的复合键,然后尝试再次保存Parent对象,它实际上更新Child中的现有行与新Parentid。
根据关系数据库,我的理解是Child表中的复合键的重复输入应该无法插入。但是,Hibernate正在更新现有行,因为值相同(??)。我尝试为复合键插入不同的值,并在Child表中插入正常。
我希望我能让你正确理解这个问题。两个表之间存在单向一对多关系,其中更新发生在具有相同值的行上。
我感到困惑的是它是一对多或复合键的问题。