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)

转载于:https://www.cnblogs.com/thlzhf/p/4249816.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值