STACKJAVA

Code ví dụ với JPA Callbacks method @PrePersist, @PreUpdate, @PostRemove

Code ví dụ với JPA Callbacks method @PrePersist, @PreUpdate, @PostRemove

JPA Callbacks Method là gì?

JPA callback method là các method lắng nghe các sự kiện như save, update, remove các đối tượng trên database.

Các annotation đánh dấu callback method:

JPA cung cấp các annotation được sử dụng trong các class entity (được đánh dấu @Entity) để lắng nghe các sự kiện save, update, delete của chính các entity đó.

@PrePersist: Thực thi trước khi entity được persist (được lưu vào database) bởi method persist()

@PostPersist: Thực thi sau khi entity được persist

@PostLoad: Thực thi sau khi một entity được load vào persistence context hiện tại hoặc một entity được refreshed.

@PreUpdate: Thực thi trước khi entity được update.

@PostUpdate: Thực thi sau khi entity được update.

@PreRemove: Thực thi trước khi entity bị xóa khỏi database bởi method remove()

@PostRemove: Thực thi sau khi entity bị xóa.

Code ví dụ JPA callback method

Lưu ý rằng các annotation JPA callback method được định nghĩa bởi JPA nên nó chỉ dùng cho entitymanager chứ không dùng được với hibernate session. Do đó nếu bạn thêm, sửa, xóa đối tượng bởi hibernate session thì các annotation JPA callback sẽ không có tác dụng.

(Với session thì người ta tạo các class listener, tuy nhiên nó không tiện lợi như các annotation jpa callback)

(Xem lại: Sự khác nhau giữa JPA với Hibernate, So sánh Hibernate Session với JPA EntityManager)

Mình sẽ sử dụng lại ví dụ truy vấn hibernate với entitymanager

Ở class entity mình sẽ viết các method lắng nghe các sự kiện thêm, sửa, xóa và sử dụng các annotation jpa callback để đánh đấu các method này.

package stackjava.com.hibernateentitymanager.entities;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.PostPersist;
import javax.persistence.PostRemove;
import javax.persistence.PostUpdate;
import javax.persistence.PrePersist;
import javax.persistence.PreRemove;
import javax.persistence.PreUpdate;
import javax.persistence.Table;

@Entity
@Table(name = "customer")
public class Customer implements Serializable{
  private static final long serialVersionUID = 1L;

  @Id
  @Column(name = "id")
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private int id;

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

  @Column(name = "address")
  private String address;
  
  @PrePersist
  public void prePersist() {
    System.out.println("pre persist!");
  }
  @PostPersist
  public void postPersist() {
    System.out.println("post persist!");
  }
  @PreUpdate
  public void preUpdate() {
    System.out.println("pre update!");
  }
  @PostUpdate
  public void postUpdate() {
    System.out.println("post update!");
  }
  @PreRemove
  public void preRemove() {
    System.out.println("pre remove!");
  }
  @PostRemove
  public void postRemove() {
    System.out.println("post remove!");
  }
  // getter - setter
}

Thực hiện thêm, sửa, xóa đối tượng

package stackjava.com.hibernateentitymanager;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import stackjava.com.hibernateentitymanager.entities.Customer;

public class MainApp {
  public static void main(String[] args) {
    EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("persistence");
    EntityManager entityManager = entityManagerFactory.createEntityManager();
    Customer customer = new Customer("Kai", "Viet Nam");
    
    // save - persist
    entityManager.getTransaction().begin();
    entityManager.persist(customer);
    entityManager.getTransaction().commit();
    
    // update
    entityManager.getTransaction().begin();				
    customer.setName("Sena");
    entityManager.getTransaction().commit();
    
    //remove
    entityManager.getTransaction().begin();				
    entityManager.remove(customer);
    entityManager.getTransaction().commit();		
    
    entityManager.close();
    entityManagerFactory.close();
  }
}

Kết quả:

Code ví dụ với JPA Callbacks method @PrePersist, @PreUpdate, @PostRemove stackjava.com

Okay, Done!

Download code ví dụ trên tại đây.

 

References.

https://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/listeners.html