Question

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?

Was it helpful?

Solution

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=?

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top