28 Mayıs 2018 Pazartesi

JPA @PostUpdate Anotasyonu - Lifecycle Callback

Giriş
Tanımı şöyledir.
@Target(value=METHOD)
@Retention(value=RUNTIME)
public @interface PostUpdate
Açıklaması şöyle. Bu metod içinde kendi entity nesnesi hariç diğer nesnelere dokunmamalı deniliyor.
In general, the lifecycle method of a portable application should not invoke EntityMan ager or query operations, access other entity instances, or modify relationships within the same persistence context[46].[47] A lifecycle callback method may modify the non-relationship state of the entity on which it is invoked.
[46] Note that this caution applies also to the actions of objects that might be injected into an entity listener.
[47] The semantics of such operations may be standardized in a future release of this specification.
@PrePersist,@PreRemove,@PostPersist,@PostRemove,@PreUpdate,@PostUpdate,@PostLoad anotasyonlarına da bakılabilir.

EntityManager.persist() çağrısı ile tetiklenir.

Örnek
Şöyle yaparız.
public class ArticleLocaliseEntityListener {
  @PostUpdate
  @PostPersist
  private void checkQuantite(ArticleBean article) throws BusinessException {
    if (article.getQuantiteStock() < 0) {
        throw new BusinessException(exceptionMsg);
    }
}
Eğer exception fırlatılırsa yakalamak için şöyle yaparız.
try {
    em.persist(entity);
} catch (RuntimeException e) {
    if (e.getCause() instanceof BusinessException) {
        // Fix the problem the way you want
    } else {
        throw e;
    }
}

Hiç yorum yok:

Yorum Gönder