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