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)