Hibernate Idempotent Update
Asked Answered
L

1

2

I tried searching this over the net but in vain. Is there a way to use hibernate to perform an idempotent update.

One use case is to use HTTP PUT to update a specific field in the database via a REST API. So for example, if I have a database with columns : Id, Name, Phone, UpdateDate and I update the Phone field (of a specific Id) with the same value multiple times only my first action must update the Phone(and also change my UpdateDate). Subsequent updates must have no effect on the record (and UpdateDate).

While this can be implemented in an application by first getting the record and comparing it against my input value before performing an update. I was wondering whether Hibernate has any inbuilt features?

Langton answered 26/8, 2011 at 21:55 Comment(3)
How is the UpdateDate set? If you are manually setting that and telling Hibernate to update the record then this will be seen as an update for the record.Brahear
@tkeE2036 right now I am doing it manually through a program. So when ever there is a "PUT" update, I check whether its a change and if so, I change the date.Langton
See also this investigation: #56454190Descendant
R
3

In hibernate if you get an object and try to modify one of it`s property and commit the transaction. Hibernate compares new values to the old values. Issues an UPDATE for all persistent properties of the entity only if the new value of at least one of the property is different than the old value.

Example:

  1. Find EntityA by id. Hibernate issues a SELECT for the entity (and any non-lazy many-to-one entities), and it remembers the original values. EntityA a = hibernateSession.find(EntityA.class, id);
  2. Set some property on entityA. a.setPhone(newPhoneValue);
  3. Commits the transaction, triggering hibernateSession.flush(). Hibernate compares new values to the old values. Issues an UPDATE for all persistent properties of x if the old and the new value of propertyB are different.

Issue an update like : UPDATE entityA set phone=?, name=?, updateDate=? WHERE id=?

If you want you can use dynamic-update and dynamic-insert in the mapping.

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.

dynamic-insert (optional - defaults to false): specifies that INSERT SQL should be generated at runtime and contain only the columns whose values are not null.

With dynamic-update set to true hibernate will issue a UPDATE without the name column because it has not change.

UPDATE entityA set phone=?, updateDate=? WHERE id=?

Revival answered 26/8, 2011 at 23:8 Comment(2)
Thanks. I haven't tried the dynamic-update before. I'l try it out.Langton
I have dynamic update true, but when an update query called in trigger, hibernate throws an exception after trying to update all the fields . How and why hibernate tries to run a query when a trigger is being called ?Halfcaste

© 2022 - 2024 — McMap. All rights reserved.