1. 理解实体的生命周期
2. 为实体生命周期事件定义监听器
3. 通过监听实现回调
4. 排除默认监听器和父类上定义的监听器
1. 理解实体的生命周期(Net Beans创建Java Project, 项目名称:Lifecycle)
Person.java
package org.crazyit.model; import javax.persistence.*; @Entity @Table(name = "person_table") public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column(name = "person_name", length = 50) private String name; private String email; private String phone; // constructor // setter // getter @PrePersist public void prePersist() { System.out.println("--Before Persisting--"); //简单加密 this.setEmail(reverse(this.getEmail())); } @PreUpdate public void preUpdate() { System.out.println("--Before Updating--"); //简单加密 this.setEmail(reverse(this.getEmail())); } @PostUpdate public void postUpdate() { System.out.println("--Post Updating--"); } @PostLoad public void postLoad() { System.out.println("--Post Loading--"); //简单地恢复 this.setEmail(reverse(this.getEmail())); } private String reverse(String raw) { StringBuffer sb = new StringBuffer(raw); return sb.reverse().toString(); } }
persistence.xml(参见12.2)
JpaQs.java(参见12.2)
2. 通过监听实现回调(Net Beans创建Java Project, 项目名称:EntityListener)
Person.java
package org.crazyit.model; import javax.persistence.*; import org.crazyit.listener.*; @Entity @Table(name="person_table") @EntityListeners(PersonPersistListener.class) public class Person { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; @Column(name="person_name" , length=50) private String name; private String email; private String phone; // constructor // setter // getter }
PersonPersistListener.java
package org.crazyit.listener; import javax.persistence.*; import org.crazyit.model.*; public class PersonPersistListener { @PrePersist public void prePersist(Object entity) { if (entity.getClass() == Person.class) { System.out.println("--Before Persisting--"); Person person = (Person) entity; //简单加密 person.setEmail(reverse(person.getEmail())); } } @PreUpdate public void preUpdate(Object entity) { if (entity.getClass() == Person.class) { System.out.println("--Before Updating--"); Person person = (Person) entity; //简单加密 person.setEmail(reverse(person.getEmail())); } } @PostUpdate public void postUpdate(Object entity) { System.out.println("--Post Updating--"); } @PostLoad public void postLoad(Object entity) { if (entity.getClass() == Person.class) { System.out.println("--Post Loading--"); Person person = (Person) entity; //简单加密 person.setEmail(reverse(person.getEmail())); } } private String reverse(String raw) { StringBuffer sb = new StringBuffer(raw); return sb.reverse().toString(); } }
persistence.xml(参见12.2)
JpaQs.java(参见12.2)
3. 为全部实体配置默认监视器(Net Beans创建Java Project, 项目名称:DefaultListener)
Person.java
package org.crazyit.model; import javax.persistence.*; @Entity @Table(name = "person_table") public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column(name = "person_name", length = 50) private String name; private String email; private String phone; // constructor // setter // getter }
orm.xml
<?xml version="1.0" encoding="UTF-8"?> <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0"> <persistence-unit-metadata> <persistence-unit-defaults> <!-- 配置默认监听器 --> <entity-listeners> <!-- class属性指定监听器类 --> <entity-listener class="org.crazyit.listener.DefaultPersistListener"> <!-- 下面4个子元素指定监听器类中哪个方法作为监听方法 --> <pre-persist method-name="prePersist"/> <pre-update method-name="preUpdate"/> <post-update method-name="postUpdate"/> <post-load method-name="postLoad"/> </entity-listener> </entity-listeners> </persistence-unit-defaults> </persistence-unit-metadata> </entity-mappings>
DefaultPersistListener.java
package org.crazyit.listener; public class DefaultPersistListener { public void prePersist(Object entity) { System.out.println("--Before Persisting--"); } public void preUpdate(Object entity) { System.out.println("--Before Updating--"); } public void postUpdate(Object entity) { System.out.println("--Post Updating--"); } public void postLoad(Object entity) { System.out.println("--Post Loading--"); } }
persistence.xml(参见12.2)
JpaQs.java(参见12.2)
4. 排除默认监听器(Net Beans创建Java Project, 项目名称:ExcludeDefaultListeners)
Person.java
package org.crazyit.model; import javax.persistence.*; import org.crazyit.listener.*; @Entity @Table(name = "person_table") //指定默认监听器对该实体类不起作用 @ExcludeDefaultListeners public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column(name = "person_name", length = 50) private String name; private String email; private String phone; // constructor // setter // getter }
orm.xml(参见#3)
DefaultPersistListener(参见#3)
persistence.xml(参见12.2)
JpaQs.java(参见12.2)
5. 排除父类上定义的监听器(Net Beans创建Java Project, 项目名称:ExcludeSupperclassListeners)
Person.java
package org.crazyit.model; import javax.persistence.*; import org.crazyit.listener.*; @Entity @Table(name = "person_table") @Inheritance(strategy = InheritanceType.JOINED) @EntityListeners(PersonPersistListener.class) public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column(name = "person_name", length = 50) private String name; private String email; private String phone; // constructor // setter // getter }
Student.java
package org.crazyit.model; import javax.persistence.*; @Entity @Table(name = "student_table") //指定父类上声明的监听器不对实体起作用 @ExcludeSuperclassListeners public class Student extends Person { private int grade; // constructor // setter // getter }
PersonPersistListener.java(参见#2)
persistence.xml(参见12.2)
JpaQs.java(参见12.2)