简体   繁体   中英

Why hibernate generates insert and update for OneToMany mapping

I am trying to understand the one-to-many mapping in Hibernate with a small example. I have a Product with a set of Part's . Here are my entity classes:

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
}

Then I tried to save some parts and products in my database and observed below queries generated by hibernate:

Hibernate: insert into Product (serialNumber) values (?)
Hibernate: insert into Part (partName, id) values (?, ?)
Hibernate: update Part set PRODUCT_ID=? where id=?

Here to add a record in Part table, hibernate generates 2 DML operations - insert and update . If a single insert command is sufficient to add a record in table then why hibernate uses both insert and update in this case? Please explain.

I know this is crazy old but I had the same problem and Google brought me here, so after fixing it I figured I should post an answer.

Hibernate will switch the insert/update approach to straight inserts if you make the join column not nullable and not updatable, which I assume in your case it is neither anyways:

@JoinColumn(name = "PRODUCT_ID", nullable = false, updatable = false)

If Part as composite element list then only two query will come. Please check and revert.

If its not a composite element , hibernate try to insert individual as a separate query and it will try to create relationship between them.

In earlier case hibernate will insert with relationship key.

**Hibernate: insert into Product (serialNumber) values (?)

Hibernate: insert into Part (partName, id) values (?, ?)**

In these two queries hibernate is simply inserting a record into the database. At that stage hibernate is not creating any relationship between the two entities.

Hibernate: update Part set PRODUCT_ID=? where id=?

Now after making entity tables,hibernate is going to make a relationship between the two by using the above third query...

The association is uni-directional, so Product is the owning side (because it's the only side).

Make the association bidirectional and make Part the association owner. That way you will avoid redundant updates because the foreign key values will be specified as part of insert statements for Part .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM