19 Kasım 2018 Pazartesi

JPA @Version Anotasyonu

Giriş
Optimistic lock için kullanılır.
JPA uses a version field in your entities to detect concurrent modifications to the same datastore record. When the JPA runtime detects an attempt to concurrently modify the same record, it throws an exception to the transaction attempting to commit last.
 OptimisticLockException Fırlatılır
Açıklaması şöyle.
If the value has changed in the meantime an OptimisticLockException will be thrown and transaction will be rolled back. Otherwise, the transaction commits the update and increments the value of version property.
Bu Alan Bir Sayıdır
Açıklaması şöyle. Version alanı genellikle long  yapılır.
This property can be a numeric (int, long, short) or java.sql.Timestamp field. Only one property with @Version annotation can exist per entity.
Örnek
Şöyle yaparız
@Entity
public class MyEntity implements Serializable {    

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @Version
    private long version;

    //...
}
Üretilen sql'de update cümlesi version bilgisini de içerir.
UPDATE MYENTITY SET ..., VERSION = VERSION + 1 WHERE ((ID = ?) AND (VERSION = ?))
Örnek
Bir kayıt bir sorgu ve bir güncelleme içeren sql şöyledir.
insert into CART1 (name, total, version) values (?, ?, ?)
select cart2x0_.cart_id as cart_id1_1_0_, cart2x0_.name as name2_1_0_, cart2x0_.total as total3_1_0_, cart2x0_.version as version4_1_0_ from CART1 cart2x0_ where cart2x0_.cart_id=?
update CART1 set name=?, total=?, version=? where cart_id=? and version=?
Örnek
Eğer arzu edilirse sütun ismi, açıklaması gibi şeyler de verilebilir. Hatta sütun ismi verilmesi mantıklı bile olabilir çünkü version kelimesi optlock yerine satırın kendi bilgisi gibi de anlaşılabilir.
@Version
@Column(name = "optlock", columnDefinition = "integer DEFAULT 0",nullable = false)
private long version = 0L;
Örnek
Şöyle yaparız.
<E extends BaseEntity> E find(E clientEntity) {
  E entity = entityManager.find(clientEntity.getClass(), clientEntity.getId());
  if (entity.getVersion() != clientEntity.getVersion()) {
    throw new ObjectOptimisticLockingFailureException(...);
  }
  return entity;
}

Hiç yorum yok:

Yorum Gönder