当前位置:   article > 正文

Spring Data JPA 从入门到精通~@EntityListeners注解示例

@entitylisteners

被@Prepersist注解的方法 ,完成save之前的操作。
被@Preupdate注解的方法 ,完成update之前的操作。
被@PreRemove注解的方法 ,完成remove之前的操作。
被@Postpersist注解的方法 ,完成save之后的操作。
被@Postupdate注解的方法 ,完成update之后的操作。
被@PostRemovet注解的方法 ,完成remove之后的操作。

 This page will provide JPA @EntityListeners example with callbacks @PrePersist, @PostPersist, @PostLoad, @PreUpdate, @PostUpdate, @PreRemove, @PostRemove. JPA @EntityListeners is used on entity or mapped superclass at class level. JPA provides callback methods for saving, fetching, updating and removing data from database. Here we will use JPA EntityManager to interact with database.

JPA @EntityListeners

@EntityListeners annotation specifies the callback listener classes . This annotation can be used for an entity or mapped superclass. 
1. To configure single callback listener class, we can do as follows.

  1. @EntityListeners(UserListener.class)
  2. public class User {}

2. To configure multiple callback listener classes, we can do as follows.

  1. @EntityListeners({UserListener1.class, UserListener2.class})
  2. public class User { }

JPA Callbacks Method

JPA provides callback methods to listen saving, fetching, updating and removing data from database. These callback methods annotated in a listener bean class must have return type void and accept one argument

@PrePersist: The method annotated with @PrePersist in listener bean class is called before persisting data by entity manager persist() method. 

@PostPersist: The method annotated with @PostPersist is called after persisting data. 

@PostLoad: The method annotated with @PostLoad is called after fetching data using entity manager find() method in persistence context or refreshing it with database by using refresh() method. If the entity instance is already loaded in persistence context, then calling of find() method will not call @PostLoad

@PreUpdate: The method annotated with @PreUpdate in listener bean class is called before updating data. 

@PostUpdate: It is called after updating data. 

@PreRemove: The method annotated with @PreRemove in listener bean class is called before removing data by using entity manager remove() method. 

@PostRemove: It is called after removing data.

Database Schema

For the demo we are using a table with following schema created in MySQL. 
Table: user

  1. CREATE TABLE `user` (
  2. `id` INT(11) NOT NULL,
  3. `name` VARCHAR(255) NULL DEFAULT NULL,
  4. PRIMARY KEY (`id`)
  5. )
  6. COLLATE='latin1_swedish_ci'
  7. ENGINE=InnoDB;

Gradle File

Find the gradle file. 
build.gradle

  1. apply plugin: 'java'
  2. apply plugin: 'eclipse'
  3. archivesBaseName = 'HibernateJPA'
  4. version = '1'
  5. repositories {
  6. mavenCentral()
  7. }
  8. dependencies {
  9. compile 'org.hibernate:hibernate-entitymanager:5.0.7.Final'
  10. compile 'mysql:mysql-connector-java:5.1.31'
  11. }

Create Listener Class

Find the listener class which consist callback methods annotated with @PrePersist, @PostPersist, @PostLoad, @PreUpdate, @PostUpdate, @PreRemove and @PostRemove. 
UserListener.java

  1. package com.concretepage;
  2. import javax.persistence.PostLoad;
  3. import javax.persistence.PostPersist;
  4. import javax.persistence.PostRemove;
  5. import javax.persistence.PostUpdate;
  6. import javax.persistence.PrePersist;
  7. import javax.persistence.PreRemove;
  8. import javax.persistence.PreUpdate;
  9. public class UserListener {
  10. @PrePersist
  11. public void userPrePersist(User ob) {
  12. System.out.println("Listening User Pre Persist : " + ob.getName());
  13. }
  14. @PostPersist
  15. public void userPostPersist(User ob) {
  16. System.out.println("Listening User Post Persist : " + ob.getName());
  17. }
  18. @PostLoad
  19. public void userPostLoad(User ob) {
  20. System.out.println("Listening User Post Load : " + ob.getName());
  21. }
  22. @PreUpdate
  23. public void userPreUpdate(User ob) {
  24. System.out.println("Listening User Pre Update : " + ob.getName());
  25. }
  26. @PostUpdate
  27. public void userPostUpdate(User ob) {
  28. System.out.println("Listening User Post Update : " + ob.getName());
  29. }
  30. @PreRemove
  31. public void userPreRemove(User ob) {
  32. System.out.println("Listening User Pre Remove : " + ob.getName());
  33. }
  34. @PostRemove
  35. public void userPostRemove(User ob) {
  36. System.out.println("Listening User Post Remove : " + ob.getName());
  37. }
  38. }

Create Entity annotated with @EntityListeners

Now find the entity annotated with @EntityListeners
User.java

  1. package com.concretepage;
  2. import javax.persistence.Column;
  3. import javax.persistence.Entity;
  4. import javax.persistence.EntityListeners;
  5. import javax.persistence.Id;
  6. import javax.persistence.Table;
  7. @Entity
  8. @EntityListeners(UserListener.class)
  9. @Table(name="user")
  10. public class User {
  11. @Id
  12. @Column(name="id")
  13. private int id;
  14. @Column(name="name")
  15. private String name;
  16. public User() {}
  17. public User(int id, String name) {
  18. this.id = id;
  19. this.name = name;
  20. }
  21. public int getId() {
  22. return id;
  23. }
  24. public String getName() {
  25. return name;
  26. }
  27. public void setName(String name) {
  28. this.name = name;
  29. }
  30. }

persistence.xml

Find the persistence.xml file.

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <persistence xmlns="http://java.sun.com/xml/ns/persistence"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
  5. http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
  6. version="2.0">
  7. <persistence-unit name="com.concretepage">
  8. <description>JPA Demo</description>
  9. <provider>org.hibernate.ejb.HibernatePersistence</provider>
  10. <properties>
  11. <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
  12. <property name="hibernate.hbm2ddl.auto" value="update"/>
  13. <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
  14. <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/concretepage"/>
  15. <property name="javax.persistence.jdbc.user" value="root"/>
  16. <property name="javax.persistence.jdbc.password" value=""/>
  17. </properties>
  18. </persistence-unit>
  19. </persistence>

Run Application

First find the JPA utility singleton class that will provide the instance of EntityManager
JPAUtility.java

  1. package com.concretepage;
  2. import javax.persistence.EntityManager;
  3. import javax.persistence.EntityManagerFactory;
  4. import javax.persistence.Persistence;
  5. public class JPAUtility {
  6. private static final EntityManagerFactory emFactory;
  7. static {
  8. emFactory = Persistence.createEntityManagerFactory("com.concretepage");
  9. }
  10. public static EntityManager getEntityManager(){
  11. return emFactory.createEntityManager();
  12. }
  13. public static void close(){
  14. emFactory.close();
  15. }
  16. }

Find the class to test the application. 
JPAListenerDemo.java

  1. package com.concretepage;
  2. import javax.persistence.EntityManager;
  3. public class JPAListenerDemo {
  4. public static void main(String[] args) {
  5. EntityManager entityManager = JPAUtility.getEntityManager();
  6. entityManager.getTransaction().begin();
  7. //persist user
  8. User user = new User(1, "Mahesh");
  9. entityManager.persist(user);
  10. entityManager.getTransaction().commit();
  11. //refresh user
  12. entityManager.refresh(user);
  13. //update user
  14. entityManager.getTransaction().begin();
  15. user.setName("Krishna");
  16. entityManager.getTransaction().commit();
  17. //remove user
  18. entityManager.getTransaction().begin();
  19. entityManager.remove(user);
  20. entityManager.getTransaction().commit();
  21. entityManager.close();
  22. JPAUtility.close();
  23. }
  24. }

Find the output.

  1. Listening User Pre Persist : Mahesh
  2. Listening User Post Persist : Mahesh
  3. Listening User Post Load : Mahesh
  4. Listening User Pre Update : Krishna
  5. Listening User Post Update : Krishna
  6. Listening User Pre Remove : Krishna
  7. Listening User Post Remove : Krishna

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/55929
推荐阅读
相关标签
  

闽ICP备14008679号