为什么hibernate会为OneToMany映射生成插入和更新

Cha*_*nya 12 java hibernate jpa

我试图用一个小例子来理解Hibernate中的一对多映射.我Product有一套Part's.这是我的实体类:

Part.java

@Entity
public class Part {
    @Id
    @GeneratedValue
    int id;
    String partName;
    //Setters & Getters
}
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试在我的数据库中保存一些部件和产品,并观察下面由hibernate生成的查询:

Hibernate: insert into Product (serialNumber) values (?)
Hibernate: insert into Part (partName, id) values (?, ?)
Hibernate: update Part set PRODUCT_ID=? where id=?
Run Code Online (Sandbox Code Playgroud)

这里要在Part表中添加记录,hibernate会生成2个DML操作 - insertupdate.如果单个insert命令足以在表中添加记录,那么为什么hibernate在这种情况下同时使用insert和update?请解释.

Gho*_*tes 7

我知道这太疯狂了,但是我遇到了同样的问题,Google还是把我带到了这里,因此,在解决它之后,我想我应该发布一个答案。

如果使联接列不可为空且不可更新,Hibernate会将插入/更新方法切换为直接插入,在您的情况下,我认为这都不是:

@JoinColumn(name = "PRODUCT_ID", nullable = false, updatable = false)
Run Code Online (Sandbox Code Playgroud)


Siv*_*mar 0

如果 Part 作为复合元素列表,则只会出现两个查询。请检查并恢复。

如果它不是复合元素,hibernate 会尝试将单个元素作为单独的查询插入,并尝试在它们之间创建关系。

在较早的情况下,休眠将插入关系键。