`
longgangbai
  • 浏览: 7329008 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hibernate回调与拦截机制

阅读更多

在某些情况下,我们需要对实体的CURD操作进行捕获并执行一些操作,这可以通过数据库触发器来实现,但是正如我们上一节中所分析的,由于触发器的执行对Hibernate Session是透明的,因此会带来很多问题(参见上一节)。为此Hibernate提供了一些专门用于捕获监听实体CURD操作的接口,通过这些接口可以实现类似触发器的功能,能够在实体发生CURD操作时捕获事件,并且执行相应的动作逻辑。在Hibernate中这些接口是:Lifecycle,Validatable,Interceptor,下面我们就分别讲解怎样通过这些接口,实现回调拦截的技术细节。

ALifecycleValidatable

HibernateLifecycle接口定义如下:

public interface Lifecycle{

/**

   在实体对象执行save/insert操作之前触发

**/

public boolean onSave(Session session) throws CallbackException;

/**

   session.update()执行之前触发

**/

public boolean onUpdate(Session session) throws CallbackException;

/**

在实体对象执行delete操作之前触发

**/

public boolean onDelete(Session session) throws CallbackException;

/**

在实体对象加载之后触发

**/

public void onLoad(Session session) throws CallbackException;

}

实体对象可以实现Lifecycle接口,来获得在持久化阶段捕获CURD事件,并执行相应动作的能如下所示:

public class User implements Serializable,Lifecycle{

public boolean onSave(Session s) throws CallbackException{

……

return false;

……

}

public boolean onUpdate(Session s) throws CallbackException{

……

return true;

……

}

public boolean onDelete(Session s) throws CallbackException{

……

return false;

……

}

public boolean onLoad(Session s) throws CallbackException{

……

}

}

对于onSave,onUpdate,onDelete方法,如果返回true则意味着需要终止执行对应的操作过程。如果在运行时抛出CallbackException,对应的操作也会被终止。

注意在接口中对应的方法中,不要去通过方法的Session参数执行持久化操作,在这些方法中Session无法正常使用,如果必须要执行一些持久化操作,那么需要进行特殊的处理,我们将在Interceptor部分详细讲解。

Hibernate中还定义了Validatable接口,该接口定义如下:

public interface Validatable{

public void validate() throws ValidationFailure;

}

Validatable接口是用来实现数据验证的,实体类实现Validatable接口,并在接口的validate方法中实现数据验证逻辑,以保证数据输入的合法性。validate方法将会在实体对象持久化前得到调用进行数据验证,与Lifecycle接口中的方法不同,Validatable.validate()方法在实体生命周期中可能被多次调用,因此此方法应该仅限于数据合法性的验证,而不应该实现业务逻辑的验证。

BInterceptor:

以上是Hibernate提供的Lifecycle接口和Validatable接口,以及使用方法,这两个方法定义了一种自然的回调机制,但是如我们所见,如果想实现对实体的回调拦截,那么相应的实体对象必须实现这两个Hibernate原生接口,这就使代码的可移植性大大下降,因为此时实体类已经不再是一个POJO了,Hibernate的那些天才的设计者们也已经意识到了这个问题,所以又提供了Interceptor接口,为持久化事件的捕获和处理提供了一个非入侵性的解决方案,Interceptor接口通过设置注入来实现持久化事件的捕获和处理,这是典型的IOC(控制反转)设计思想。下面我们就讲解Interceptor接口的技术细节和使用方法。

Hibernate中的Interceptor接口定义如下:

public interface Interceptor{

//对象初始化之前调用,这时实体对象刚刚被创建,各个属性还都为null,如果在这个方法中修改了实体对象的数据,那么返回true,否则返回null.

public boolean onLoad(Object entity,Serializable id,Object[] state,

String[] propertyNames,Type[] types) throws CallbackException;

      //Session.flush()在进行脏数据检查时,如果发现实体对象数据已脏,就调用此方法

public boolean onFlushDirty(Object entity,Serializable id,Object[] state,

String[] propertyNames,Type[] types) throws CallbackException;

//实体对象被保存前调用,如果在这个方法中修改了实体对象的数据,那么返回true,否则返回null.

public boolean onSave(Object entity,Serializable id,Object[] state,

String[] propertyNames,Type[] types) throws CallbackException;

     //通过Session删除一个实体对象前调用

public boolean onDelete(Object entity,Serializable id,Object[] state,

String[] propertyNames,Type[] types) throws CallbackException;

     //Session执行flush()之前调用

public boolean preFlush(Iterator entities) throws CallbackException;

     //Session执行flush()之后,所有的SQL语句都执行完毕后调用

public boolean postFlush(Iterator entities) throws CallbackException;

     //当执行saveOrUpdate方法时调用,判断实体对象是否已经保存

     public Boolean isUnsaved(Object entity);

     //执行Session.flush()方法时,调用此方法判断该对象是否为脏对象,这提供了脏数据检查的另一个回调拦截机制

public int[] findDirty(Object entity,Serializable id,Object[] state,

String[] propertyNames,Type[] types) throws CallbackException;

     //Session构造实体类实例前调用,如果返回null,Hibernate会按照默认方式构造实体类对象实例

public Object findDirty(Class clazz,Serializable id) throws CallbackException;

}

Intercepter不需要实体对象来实现,而是通过开发人员定义一个实现Interceptor接口的类,然后在创建Hibernate Session时,通过将Interceptor对象设置进所创建的Session,这样通过这个Session来操作的实体对象,就都会具有对持久化动作的回调拦截能力。在HibernateInterceptor对象共有两种用法,如下所述:

1                SessionFactory.openSession(Interceptor):为每个Session实例分配一个拦截Interceptor,这个拦截接口对象,存放在Session范围内,为每个Session实例所专用。

2                Configuration.setInterceptor(Interceptor):SessionFactory实例分配一个Interceptor实例,这个Interceptor实例存放在SessionFactory范围内,被每个Session实例所共享。

AInterceptor的典型应用:

 

分享到:
评论

相关推荐

    深入浅出Hibernate中文版 part1

    5.2 Hibernate回调与拦截机制 5.3 Hibernate实用技术 第6章 Hibernate 实战——创建RedSaga论坛 6.1 目标 6.2 E-R建模还是对象建模 6.3 E-R建模及工具集 6.4 对象建模 6.5 项目的目录组织和基础设施 6.6 测试...

    深入浅出Hibernate中文版 part2

    5.2 Hibernate回调与拦截机制 5.3 Hibernate实用技术 第6章 Hibernate 实战——创建RedSaga论坛 6.1 目标 6.2 E-R建模还是对象建模 6.3 E-R建模及工具集 6.4 对象建模 6.5 项目的目录组织和基础设施 6.6 测试...

    Hibernate的高级操作

    #### Hibernate回调与拦截机制 Hibernate提供了一套强大的事件监听系统,允许开发者在特定时刻执行自定义逻辑。这包括但不限于实体的创建、更新、删除等生命周期事件。 - **Lifecycle与Validatable接口**:`...

    深入浅出Hibernate

    再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了 Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、 ...

    中文 深入浅出Hibernate

    再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、...

    深入浅出Hibernate(PDF)第一部分

    再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、...

    Hibernate的高级操作[归纳].pdf

    在本章中,我们将深入探讨Hibernate的高级特性,特别是关于对象的持久化实现和回调与拦截机制。首先,让我们详细解析Hibernate的实体对象生命周期。 在Hibernate中,实体对象经历了三种不同的状态,它们分别是: 1...

    深入浅出Hibernate(PDF)第二部分

    再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、...

    深入浅出hibernate(PDF)第三部分

    再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、...

    深入浅出Hibernate2

    再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、...

    \深入浅出Hibernate

    再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、...

    hibernate教程hibernate教程

    Hibernate提供了回调和拦截机制,允许在特定事件(如对象保存、更新、删除等)前后执行自定义代码。这在数据同步、日志记录或其他业务逻辑处理中非常有用。 **配置二级缓存** 配置二级缓存需要指定缓存策略(如read...

    《深入浅出Hibernate》1

    再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、...

    hibernate最新版本5.2.3所有jar包

    - Hibernate提供了对JPA规范的扩展,如`@PrePersist`、`@PostLoad`等回调注解,增强了实体的生命周期管理。 10. **性能优化**: - Hibernate提供了各种性能调优选项,包括批处理、延迟加载、懒加载等策略,以适应...

    夏昕.深入浅出Hibernate

    再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了 Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、 ...

Global site tag (gtag.js) - Google Analytics