JavaEE(16) - JPA生命周期及監聽器


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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM