国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > web前端 > htmlcss > [置顶] 持久化API(JPA)系列(五)控制实体Bean的生命周期

[置顶] 持久化API(JPA)系列(五)控制实体Bean的生命周期

来源:程序员人生   发布时间:2015-05-26 07:47:20 阅读次数:3477次

   上篇文章《持久化API(JPA)系列(4)管理器EntityManager--履行数据库更新》中我们讲授了使用实体管理器的各种函数操作数据库的方法。

本文主要讲:控制实体Bean的生命周期。
预会话Bean类似,实体Bean也有自己的生命周期,分别对应不同的状态。

下面我们首先来说解实体Bean的状态和生命周期事件:
1、实体Bean生命周期的4种状态
2、实体Bean的事件:
    @PostLoad
    @PrePersist和@PostPersist
    @PreUpdate和@PostUpdate
    @PreRemove和@PostRemove。

3、事件回调的两种方法:
    外部回调:编写外部监听器。


=============================================================================
1、实体Bean生命周期的4种状态
实体分为被容器管理和不被容器管理两种。可以通过实体管理器的的两个方法进行检测:
    contains()用来检查实体是不是被管理。
    clear()分离实体。



实际上,实体共有4种状态。
   
new--新实体:实体由利用产生,和实体管理器没有任何联系,也没有唯1的标识符。
    managed--持久化实体:新实体和实体管理器产生关联(通过persist()、merge()等方法),在实体管理器中存在和被管理,标志是在实体管理器中有1个唯1的标识符。
    detached--分离的实体:实体有唯1的标识符,但它的标识符不被实体管理器管理。
    removed--删除的实体:实体被remove()方法删除,对应的记录将会在当前事务提交的时候从数据库中删除。

=============================================================================
2、实体Bean生命周期的回调事件
当你在履行各种持久化方法的时候,实体的状态会随之改变,状态的改变会引发不同的生命周期事件。这些事件可使用不同的注释符来唆使产生时的回调函数。
    @PostLoad 加载后
    @PrePersist和@PostPersist 持久化前后
    @PreUpdate和@PostUpdate 更新前后
    @PreRemove和@PostRemove 删除前后

以上的7种事件对应了数据库的4种操作。

1)数据库查询
@PostLoad事件在以下情况下触发:
履行EntityManager.find()或getreference()方法载入1个实体后。
履行JPQL查询后。
EntityManager.refresh()方法被调用后。

2)数据库插入
@PrePersist和@PostPersist事件在实体对象插入到数据库的进程中产生:
@PrePersist事件在调用persist()方法后立刻产生,此时的数据还没有真正插入进数据库
@PostPersist事件在数据已插入进数据库后产生。

3)数据库更新

@PreUpdate和@PostUpdate事件的触发由更新实体引发:
@PreUpdate事件在实体的状态同步到数据库之前触发,此时的数据还没有真正更新到数据库
@PostUpdate事件在实体的状态同步到数据库以后触发,同步在事务提交时产生。

4)数据库删除
@PreRemove和@PostRemove事件的触发由删除实体引发:
@PreRemove事件在实体从数据库删除之前触发,即在调用remove()方法删除时产生,此时的数据还没有真正从数据库中删除。
@PostRemove事件在实体从数据库中删除后触发。

=============================================================================
3、外部回调--编写外部监听器
对以上7种事件类型,我们可以用两种方法来实现回调。
外部回调:即编写1个实体监听器,实现对某1个实体Bean的回调。
内部回调:通过在实体Bean内部的监听进行回调。


1)外部回调:
A.首先编写1个回调的监听器类,该类需要使用@javax.persistence.EntityListeners注释符绑定目标实体Bean,实现实体Bean的监听。
B.在该类中可以编写多个回调方法,通过在方法前添加不同的回调注释符实现事件的拦截。
C.回调方法需要返回void型值,并且具有1个Object参数。

这类通过编写外部监听器的方法,类似于AOP的功能,可以通过外部类实现对系统中目标类和函数的监听。
Demo演示

2)内部回调步骤:
A.回调方法写在实体Bean中。直接写在实体Bean中的回调方法不需带任何参数。
B.直接写在实体Bean中的回调方法不需带任何参数。
C.不同的回调函数也是通过回调注释符进行注释来标注的。

Demo演示





生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生