3

How can I update an entity "effectively" in hibernate just as by using SQL.

For example : I have a Product entity, which has a field name createTime. When I use session.saveOrUpdate(product) I have to get this field from database and then set to product then update, actually whenever I use session.saveOrUpdate(), I updated ALL fields, even if I need to update only one field. But most of time the value object we passed to DAO layer can't contain all fields information, like the createDate in Product, we seldom need to update this field.

How to just update selected fields? Of course I can use HQL, but that will separate save and update logic .

It would be better If Hibernate has a method like this :

session.updateOnlyNotNullFields(product);

How can I do this in Hibernate ?

1

2 Answers 2

10

By default, Hibernate doesn't use dynamic updates and indeed updates the whole object. The resulting overhead is IMO minimal even for large entities and you shouldn't worry about it.

It is possible to change this behavior though by setting the dynamic-update attribute to true on the class element:

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.

And this is the annotation equivalent (on @org.hibernate.annotations.Entity, it's an extension to JPA):

dynamicUpdate: allow dynamic SQL for updates

But I think you're worrying too much. Use the above in exceptional and very particular circumstances only.

Sign up to request clarification or add additional context in comments.

7 Comments

Thanks for the revision , I not an English speaker. I am not worrying the overhead , what I am worrying is the front end value object doesn't contains full properties of the entity , and update using this kind of transient object , will set existing fields to null .
@Tony Ohhh, I understand now. Not sure this is the right answer though.
@Pascal Thivent: If You have the right answers , please let me know :)
@Tony Well, why don't you send and return fully valued VO? Why are fields null?
@Pascal Thivent: Fully valued VO is not really necessary , e.g. I only allow the user to update 7 of 12 properties , it's all right to get all of the properites from datebase , but I have to store the other 5 properties somewhere in the front end , in order to passback a full valued VO ? And often some of the properties should be updated on a very rarely basis , i.e. createTime .
|
1

If you use the latest hibernate(3.5.5),you can native sql as following,

session.createSQLQuery("update table_name set column_1=:col1 ").executeUpdate(). this way don't load or get first and then update.just update as using sql.Hope help you!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.