JPA – Entity Listener

JPA ile yapılan crud operasyonlarında java tarafında triger benzeri yapılar kullanmak için entity listenerlar kullanılabilir. Bunlar JPA entity lifecycle sürecinde devreye girerler. İlgili operasyonun lifecycle ın hangi sürecinde devreye gireceğini aşağıdaki listedeki anotation lar ile göstermemiz gerekiyor.

@PrePersist
@PostPersist
@PreRemove
@PostRemove
@PreUpdate
@PostUpdate
@PostLoad

Bunlardan pre ile başlayanlar ilgili operasyon öncesinde post ile başlayanlar ise operasyon sonrasında devreye girer.
Aşağıda örnek bir entity listener sınıfı bulunmaktadır.

    import javax.persistence.PostLoad;
    import javax.persistence.PostPersist;
    import javax.persistence.PostRemove;
    import javax.persistence.PostUpdate;
    import javax.persistence.PrePersist;
    import javax.persistence.PreRemove;
    import javax.persistence.PreUpdate;
     
    public class EntityListenerSinifi {
     
     @PrePersist
     public void prePersistMetodu(Sirket entity) {
      System.out.println("prePersistMetodu");
     }
     @PreUpdate
     public void preUpdateMetodu(Sirket entity) {
      System.out.println("preUpdateMetodu");
     }
     @PreRemove
     public void preRemoveMetodu(Sirket entity) {
      System.out.println("preRemoveMetodu");
     }
     
     @PostLoad
     public void postLoadMetodu(Sirket entity) {
      System.out.println("postLoadMetodu");
     }
     @PostPersist
     public void postPersistMetodu(Sirket entity) {
      System.out.println("postPersistMetodu");
     }
     @PostUpdate
     public void postUpdateMetodu(Sirket entity) {
      System.out.println("postUpdateMetodu");
     }
     @PostRemove
     public void postRemoveMetodu(Sirket entity) {
      System.out.println("postRemoveMetodu");
     }
    }

Bu listenerı bir entity içerisindede kullanabilrisiniz ama ayrı bir sınıf olarak aşağıdaki gibi bir tanım yapılmalıdır.

    import java.io.Serializable;
    import javax.persistence.Entity;
    import javax.persistence.EntityListeners;
    import javax.persistence.Id;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Version;
    import org.hibernate.validator.Length;
     
    @Entity
    @EntityListeners(value={EntityListenerSinifi.class})
    public class Sirket implements Serializable {
     private Long id;
     private String name;
     
     @Id @GeneratedValue
     public Long getId() {
          return id;
     }
     
     public void setId(Long id) {
          this.id = id;
     }
     
     @Length(max=50)
     public String getName() {
          return name;
     }
     
     public void setName(String name) {
          this.name = name;
     }    
    }

Şimdi entity üzerinde aşağıdaki gibi birkaç operasyon yapalım.

    public void test(){
     Sirket sirket = new Sirket();
      sirket.setName("Merge Yazilim");
         System.out.println("Sirket kaydediliyor…");
         this.getEntityManager().persist(sirket);
         System.out.println("Sirket kaydedildi…");
         System.out.println("Sirket degistiriliyor…");
         sirket.setName("Merge Yazilim Eğitim ve Danışmanlık");
         this.getEntityManager().persist(sirket);
         this.getEntityManager().flush();
         System.out.println("Sirket degistirildi…");
         System.out.println("Sirket siliniyor…");
         this.getEntityManager().remove(sirket);
         System.out.println("Sirket silindi…");
    }

Bu operasyonu çalıştırsak çıktımız aşağıdaki gibi olacaktır.

00:15:21,312 INFO [STDOUT] Sirket kaydediliyor…
00:15:21,328 INFO [STDOUT] prePersistMetodu
00:15:21,328 INFO [STDOUT] postPersistMetodu
00:15:21,328 INFO [STDOUT] Sirket kaydedildi…
00:15:21,328 INFO [STDOUT] Sirket degistiriliyor…
00:15:21,328 INFO [STDOUT] preUpdateMetodu
00:15:21,343 INFO [STDOUT] postUpdateMetodu
00:15:21,343 INFO [STDOUT] Sirket degistirildi…
00:15:21,343 INFO [STDOUT] Sirket siliniyor…
00:15:21,343 INFO [STDOUT] preRemoveMetodu
00:15:21,343 INFO [STDOUT] Sirket silindi…
00:15:21,343 INFO [STDOUT] postRemoveMetodu

No comments yet.

Leave a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>