我试图用一个小例子来理解Hibernate中的一对多映射.我的产品有一套Part’s.这是我的实体类:
Part.java
@Entity public class Part { @Id @GeneratedValue int id; String partName; //Setters & Getters }
Product.java
@Entity public class Product { private String serialNumber; private Set<Part> parts = new HashSet<Part>(); @Id public String getSerialNumber() { return serialNumber; } @OneToMany @JoinColumn(name = "PRODUCT_ID") public Set<Part> getParts() { return parts; } // Setter methods }
然后我尝试在我的数据库中保存一些部件和产品,并观察下面由hibernate生成的查询:
Hibernate: insert into Product (serialNumber) values (?) Hibernate: insert into Part (partName,id) values (?,?) Hibernate: update Part set PRODUCT_ID=? where id=?
这里要在Part表中添加一条记录,hibernate会生成2个DML操作 – 插入和更新.如果单个insert命令足以在表中添加记录,那么为什么hibernate在这种情况下使用insert和update?请解释.
解决方法
我知道这很疯狂,但我有同样的问题,谷歌把我带到了这里,所以在修好后我想我应该发一个答案.
如果你使连接列不可为空且不可更新,Hibernate会将插入/更新方法切换为直接插入,我认为在你的情况下它不是任何方式:
@JoinColumn(name = "PRODUCT_ID",nullable = false,updatable = false)