快速业务通道

使用Apache OpenJPA开发EJB 3.0应用,第6部分:处理实体生命周期事件的回调 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

使用Apache OpenJPA开发EJB 3.0应用,第6部分:处理实体生命周期事件的回调

时间:2011-08-31 IBM 肖菁

企业应用开发过程中,经常会存在这样的需求:当企业应用中的某些数据被增 加、删除、修改时,引发一些特定的动作,完成企业应用中的一些特别的要求, 比如企业应用中要完成数据操作日志、处理数据之间的某种关系、或者是完成一 些局部的统计工作等。通常情况下,开发者有两种选择:

开发者提供独立 的代码来处理这种需求;

使用关系型数据库中的“触发器”技 术 , 让开发者指定在特定表中添加、删除、修改数据时引发特定的动作,完成数 据库中数据的处理。

然而这两种方式都有一定的局限性,在第 1 种方式 中,特别设计的代码和主体程序之间的耦合性较高,无法独立维护,很难复用; 第 2 种方式仅仅适用于关系型数据库开发的情况,开发方式比较受局限。

OpenJPA 中提供了另外一种方式来处理这种特殊的需求,即回调方法。回 调方法可以监视实体的整个生命周期,在生命周期的各个时期均可以轻松的加入 开发者自己的代码,处理实际业务中的特殊需求。OpenJPA 中目前支持的实体生 命周期包括:实体持久化之前、实体可以被持久化、实体被加载之后、实体状态 写入数据库之前、实体状态写入数据库之后、实体被删除之前、实体被删除之后 。

OpenJPA 中的回调方法可以在两个层次上实现 :

在实体类中定 义回调方法

开发者在实体类中编写与实际业务需求相匹配的处理方法,通过注释将这 些方法注册到实体生命周期监听机制中,当实体的对应生命周期事件触发时,这 些方法将被调用,从而满足用户的特定业务需求。这种方式适用于那些回调方法 不太多、业务也不复杂的情况,同时这也不是被推荐的一种编程方式。

为实体类提供监听器

开发者除了在实体类中定义回调方法之外,还有一种方式可以将实体的生 命周期事件和 Java 方法联系起来,就是使用实体监听器,它使用类似 Awt 或者 Swing 中的监听机制。开发者提供实体监听器,然后将这些监听器注册到合适的 实体上,实体成为事件发生的源。当实体生命周期事件触发时,这些被注册的实 体监听器将会逐一被激活。使用实体监听器,可以实现监听器的继承、共享、复 用,因此能够适用于比简单使用回调方法更复杂的业务环境下。

实体生命周期相关注释

OpenJPA 中能够为实体生命周期的多个阶段提 供回调支持,包括实体持久化之前、持久化时、被初始化时等。实体生命周期的 每一个阶段在 JPA 中都有相应的回调方法注释,这些注释可以在实体类或者实体 类的监听器中使用,开发者使用这些注释来指派回调发生时实体类中被调用的方 法。

使用Apache OpenJPA开发EJB 3.0应用,第6部分:处理实体生命周期事件的回调(2)

时间:2011-08-31 IBM 肖菁

OpenJPA 中支持的实体生命周期和它们对应的注释如下 :

属性 说明
javax.persistence.PrePersist   使用该注释的 方法将在实体被持久化之前被调用。

被 PrePersist 注释的方法中通常为 实体的一些属性提供某种特殊值或者完成某些计算任务,比如开发者可以在 PrePersist 注释的方法中设置实体对象的主键值或者对一些持久化字段的内容进 行计算。

javax.persistence.PostPersist   使 用 PostPersist 注释的方法在实体设置为可持久化时被调用。

被 PostPersist 注释的方法中通常完成实体持久化后的一些后续动作,比如在常见 的 MVC 模式下,开发者在实体被持久化完成后,使用被 PostPersist 注释的方 法完成视图层的更新,另外一种常见的处理是去完成一些额外的数据一致性处理 。

javax.persistence.PostLoad   使用 PostLoad 注释的方法在实体的所有提前抓取字段从数据库中完全取出时被调用。

在被 PostLoad 注释的方法中 , 无法访问到延迟抓取的持久字段的值。 在 OpenJPA 中,实体的属性支持提前抓取或者延迟抓取两种策略,提前抓取是指 实体属性在实体查询 SQL 执行时就已经从数据库中提取到内存中,延迟抓取是指 实体属性一些字段在实体查询 SQL 执行时并没有从数据库中提取到内存中,而是 在应用访问到该字段时才从数据库中,延迟抓取主要适用于一些比较大的对象如 大字符对象。

被 PostLoad 注释的方法中通常的业务逻辑就是初始化非持 久字段 , 这些非持久化字段的值依赖于实体的其他持久字段的值,比如企业应用 中要显示一个用户的图片时,由于图片通常保存在文件系统中,就需要在被 PostLoad 注释的方法中根据用户的信息初始化图片信息。

javax.persistence.PreUpdate   使用 PreUpdate 注释的方法在对象状态被保存到数据库中之前被调用。

被 PreUpdate 方法注释的方法的业务逻辑通常和被 PostLoad 方法注释的方法中的 业务逻辑正好相反。被 PostLoad 注释的方法中使用持久化数据初始化非持久化 字段的内容 , 被 PreUpdate 注释的方法中则通常用非持久化数据的内容设置持 久化字段的值。

javax.persistence.PostUpdate    使用 PostUpdate 注释的方法在对象状态保存到数据库后调用。

使用 PostUpdate 注释的方法中处理的业务逻辑一般作用是清除应用层缓存的、过期的 数据,避免它们造成对企业应用性能的影响。

javax.persistence.PreRemove   使用 PreRemove 注释的方法在对象被删除的时候调用。

在被 PreRemove 注释 的方法中访问持久字段是不支持的,可以使用该方法实现级连删除 , 或者完成其 他清除策略。

javax.persistence.PostRemove    使用 PostRemove 注释的方法在实体对象被删除后调用。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号