Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JPA2.0/Hibernate: Why JPA fires query to update all columns value even some states of managed beans are changed?

I am using JPA2.0 with Hibernate.

For example I have JPA entity for below table:

User [userId, userName, userAddress]

I can fetch user entity using find() method:

User user = entityManager.find(User.class , 1L); // 1L is user id

Now, If I change any user's state (let say userName) on same user entity I fetched above:

user.setUserName("Narendra");

And perform merge using merge() method:

entityManager.merge(user);

Merge is performed successfully with below query which is fired by JPA/hibernate while merging:

Hibernate: update User set USERID =?, USERNAME=?, USERADDRESS=? where USERID=?

Here my question is, If I changed only user name state in User entity, I did not change the userId, userAddress etc. JPA should fire below query (just to change userName) rather above query.

 Hibernate: update User set USERNAME=? where USERID=?

Any idea on it?

like image 416
Narendra Verma Avatar asked Apr 02 '13 09:04

Narendra Verma


2 Answers

Look into the dynamic-update property.

dynamic-update (optional - defaults to false): specifies that UPDATE SQL should be generated at runtime and can contain only those columns whose values have changed.

Take into account that dynamic updates can have some impact on performance. There's a little overhead involved in using it, and it might be counterproductive if you don't have a large (maybe legacy) table with lots of columns that are unlikely to be modified. See this related question Hibernate : dynamic-update dynamic-insert - Performance Effects.

Hibernate < 4.0

If you're using Hibernate Annotations, use the Hibernate specific @Entity annotation along with the JPA one:

@org.hibernate.annotations.Entity(dynamicUpdate = true)

If you're using XML mappings:

<class name="User" table="user" dynamic-update="true">

Hibernate >= 4.0

The Hibernate-specific @Entity annotation has been deprecated in Hibernate 4.0, and is scheduled to disappear in 4.1. The proper way to use dynamic updates is to annotate the entity with @DynamicUpdate now (thanks @Tiny for the heads up).

like image 154
Xavi López Avatar answered Oct 26 '22 00:10

Xavi López


Also can be used as annotation:

import org.hibernate.annotations.DynamicUpdate;

@Entity
@DynamicUpdate
@Table(name = "payments")
public class Payment {
    ...
}
like image 27
Pavel Evstigneev Avatar answered Oct 25 '22 23:10

Pavel Evstigneev