2020-08-13

Hibernate JPA @SelectBeforeUpdate Example

@SelectBeforeUpdate

The @SelectBeforeUpdate annotation is used to specify that the currently annotated entity state be selected from the database when determining whether to perform an update when the detached entity is reattached.

SelectBeforeUpdate should the entity's current state be selected from the database when determining whether to perform an update when re-attaching detached entities?

Example : OptimisticLockType.DIRTY mapping example

@Entity(name = "Person")
@OptimisticLocking(type = OptimisticLockType.DIRTY)
@DynamicUpdate
@SelectBeforeUpdate
public static class Person {

@Id
private Long id;

@Column(name = "`name`")
private String name;

private String country;

private String city;

@Column(name = "created_on")
private Timestamp createdOn;

//Getters and setters are omitted for brevity
}

The main advantage of OptimisticLockType.DIRTY over OptimisticLockType.ALL and the default OptimisticLockType.VERSION used implicitly along with the @Version mapping, is that it allows you to minimize the risk of OptimisticLockException across non-overlapping entity property changes.

When using OptimisticLockType.DIRTY, you should also use @DynamicUpdate because the UPDATE statement must take into consideration all the dirty entity property values, and also the @SelectBeforeUpdate annotation so that detached entities are properly handled by the Session#update(entity) operation.

No comments:

Post a Comment