企业应用开发过程中,经常会存在这样的需求:当企业应用中的某些数据被增 加、删除、修改时,引发一些特定的动作,完成企业应用中的一些特别的要求, 比如企业应用中要完成数据操作日志、处理数据之间的某种关系、或者是完成一 些局部的统计工作等。通常情况下,开发者有两种选择:
开发者提供独立 的代码来处理这种需求;
使用关系型数据库中的“触发器”技 术 , 让开发者指定在特定表中添加、删除、修改数据时引发特定的动作,完成数 据库中数据的处理。
然而这两种方式都有一定的局限性,在第 1 种方式 中,特别设计的代码和主体程序之间的耦合性较高,无法独立维护,很难复用; 第 2 种方式仅仅适用于关系型数据库开发的情况,开发方式比较受局限。
OpenJPA 中提供了另外一种方式来处理这种特殊的需求,即回调方法。回 调方法可以监视实体的整个生命周期,在生命周期的各个时期均可以轻松的加入 开发者自己的代码,处理实际业务中的特殊需求。OpenJPA 中目前支持的实体生 命周期包括:实体持久化之前、实体可以被持久化、实体被加载之后、实体状态 写入数据库之前、实体状态写入数据库之后、实体被删除之前、实体被删除之后 。
OpenJPA 中的回调方法可以在两个层次上实现 :
在实体类中定 义回调方法
开发者在实体类中编写与实际业务需求相匹配的处理方法,通过注释将这 些方法注册到实体生命周期监听机制中,当实体的对应生命周期事件触发时,这 些方法将被调用,从而满足用户的特定业务需求。这种方式适用于那些回调方法 不太多、业务也不复杂的情况,同时这也不是被推荐的一种编程方式。
为实体类提供监听器
开发者除了在实体类中定义回调方法之外,还有一种方式可以将实体的生 命周期事件和 Java 方法联系起来,就是使用实体监听器,它使用类似 Awt 或者 Swing 中的监听机制。开发者提供实体监听器,然后将这些监听器注册到合适的 实体上,实体成为事件发生的源。当实体生命周期事件触发时,这些被注册的实 体监听器将会逐一被激活。使用实体监听器,可以实现监听器的继承、共享、复 用,因此能够适用于比简单使用回调方法更复杂的业务环境下。
实体生命周期相关注释
OpenJPA 中能够为实体生命周期的多个阶段提 供回调支持,包括实体持久化之前、持久化时、被初始化时等。实体生命周期的 每一个阶段在 JPA 中都有相应的回调方法注释,这些注释可以在实体类或者实体 类的监听器中使用,开发者使用这些注释来指派回调发生时实体类中被调用的方 法。