ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:19.20KB ,
资源ID:18441471      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18441471.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Hibernate的事件机制文档格式.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Hibernate的事件机制文档格式.docx

1、 public void onDelete(Object entity,Serializable id,Object state,String propertyNames, Type types) /do nothing /同步Session和数据库中的数据 public boolean onFlushDirty(Object entity, Serializable id, Object currentState, Object previousState, String propertyNames, Type types) /每同步一次,修改的累加器加1 updates+; for ( i

2、nt i=0; i propertyNames.length; i+ ) if ( lastUpdateTimestamp.equals( propertyNamesi ) ) currentStatei = new Date(); return true; return false; /加载持久化实例时,调用该方法 public boolean onLoad(Object entity,Serializable id,Object state,String propertyNames,Type types) System.out.println(=);name System.out.prin

3、tln(statei); statei = aaa; /保存持久化实例时,调用该方法 public boolean onSave(Object entity,Serializable id,Object creates+; ipropertyNames.length;createTimestamp statei = new Date(); /提交刷新 public void postFlush(Iterator entities)创建的次数: + creates + , 更新的次数: + updates); public void preFlush(Iterator entities) upd

4、ates=0; creates=0; /事务提交前,触发该方法 public void beforeTransactionCompletion(Transaction tx)事务即将结束 /事务提交后,触发该方法 public void afterTransactionCompletion(Transaction tx)事务已经结束在上面的拦截器实现类中,实现了很多方法,这些方法都是在Hibernate执行特定动作时自动调用。完成了拦截器的定义,下面是关于拦截器的使用。拦截器的使用有两种方法: 通过SessionFactory的openSession(Interceptor in)方法打开一个

5、带局部拦截器的Session。 通过Configuration的setInterceptor(Interceptor in)方法设置全局拦截器。下面是使用局部拦截器的示例代码:public class HibernateUtil /静态类属性 SessionFactory public static final SessionFactory sessionFactory; /静态初始化块,完成静态属性的初始化 static try /采用默认的hibernate.cfg.xml来启动一个Configuration的实例 Configuration configuration=new Confi

6、guration().configure(); /由Configuration的实例来创建一个SessionFactory实例 sessionFactory = configuration.buildSessionFactory(); catch (Throwable ex) System.err.println(初始化sessionFactory失败. + ex); throw new ExceptionInInitializerError(ex); /ThreadLocal是隔离多个线程的数据共享,不存在多个线程之间共享资源,因此不再需要 对线程同步 public static final

7、 ThreadLocal session = new ThreadLocal(); /不加拦截器的打开Session方法 public static Session currentSession() throws HibernateException Session s = (Session) session.get(); /如果该线程还没有Session,则创建一个新的Session if (s = null) s = sessionFactory.openSession(); /将获得的Session变量存储在ThreadLocal变量的Session里 session.set(s); r

8、eturn s; /加拦截器的打开Session方法 public static Session currentSession(Interceptor it) throws HibernateException /以拦截器创建Session对象 s = sessionFactory.openSession(it); /关闭Session对象 public static void closeSession() throws HibernateException if (s != null) s.close(); session.set(null);上面的Hibernate工具类提供了两个curr

9、entSession方法,分别用于不使用拦截器获取Session对象和使用拦截器获取Session对象。下面是主程序使用拦截器的代码片段:private void testUser() /以拦截器开始Session Session session = HibernateUtil.currentSession(new MyInterceptor(); /开始事务 Transaction tx = session.beginTransaction(); /执行下面的代码时,可以看到系统回调onSave等方法 /* User u = new User(); u.setName(Yeeku Lee u

10、.setAge(28); u.setNationality(中国 session.persist(u); u.setAge(29); u.setAge(30);*/ /执行下面的代码时,可以看到系统回调onLoad等方法 Object o = session.load(User.class , new Integer(1); System.out.println(o); User u = (User)o; System.out.println(u.getName(); /提交事务时,可以看到系统回调事务相关方法 mit(); HibernateUtil.closeSession();4.8.2

11、 事件系统Hibernate 3的事件系统是功能更强大的事件框架,事件系统可以替代拦截器,也可以作为拦截器的补充来使用。基本上,Session接口的每个方法都有对应的事件。如LoadEvent和FlushEvent等。当Session调用某个方法时,Hibernate Session会生成对应的事件,并激活对应的事件监听器。系统默认监听器实现的处理过程,完成了所有的数据持久化操作,包括插入和修改等操作。如果用户定义了自己的监听器,则意味着用户必须完成对象的持久化操作。例如,可以在系统中实现并注册LoadEventListener监听器,该监听器负责处理所有调用Session的load()方法的

12、请求。监听器是单态模式对象,即所有同类型的事件处理共享同一个监听器实例,因此监听器不应该保存任何状态,即不应该使用成员变量。使用事件系统可按如下步骤进行:(1)实现自己的事件监听器类;(2)注册自定义事件监听器,代替系统默认的事件监听器。实现用户的自定义监听器有如下3个方法: 实现对应的监听器接口,这是不可思议的,实现接口必须实现接口内的所有方法,关键是必须实现Hibernate对应的持久化操作,即数据库访问,这意味着程序员完全取代了Hibernate的底层操作。 继承事件适配器,可以选择性地实现需要关注的方法,但依然试图取代Hibernate完成数据库的访问,这也不太现实。 继承系统默认的事

13、件监听器,扩展特定方法。实际上,前两种方法很少使用。因为Hibernate的持久化操作也是通过这些监听器实现的,如果用户取代了这些监听器,则应该自己实现所有的持久化操作,这意味着用户放弃了Hibernate的持久化操作,而改为自己完成Hibernate的核心操作。通常推荐采用第三种方法实现自己的事件监听器。Hibernate默认的事件监听器都被声明成non-final,从而方便用户继承。下面是用户自定义监听器的示例:/自定义LoadListener,继承默认的DefaultLoadEventListener实现类public class MyLoadListener extends Defau

14、ltLoadEventListener /在LoadEventListener接口仅仅定义了这个方法 public Object onLoad(LoadEvent event, LoadEventListener.LoadType loadType)throws HibernateException /先调用父类的onLoad方法,从而完成默认的持久化操作 Object o = super.onLoad(event, loadType); /加入用户的自定义处理自定义的load事件 System.out.println(event.getEntityClassName() + = event.

15、getEntityId(); return o;下面还有一个MySaveListener,用于监听SaveEvent事件:/自定义SavaListener,继承默认的DefaultSaveEventListener实现类public class MySaveListener extends DefaultSaveEventListener /该方法完成实际的数据插入动作 protected Serializable performSaveOrUpdate(SaveOrUpdateEvent event) /先执行用户自定义的操作 System.out.println(event.getObje

16、ct(); /调用父类的默认持久化操作 return super.performSaveOrUpdate(event);注意:扩展用户自定义监听器时,别忘了在方法中调用父类的对应方法。注册用户自定义监听器也有两种方法: 编程式,通过使用Configuration对象编程注册。 声明式,在Hibernate的XML格式配置文件中进行声明,使用Properties格式的配置文件将无法配置自定义监听器。下面的示例代码,通过编程方式使用自定义监听器:public class HibernateUtil2 Configuration cfg = new Configuration(); /注册loadE

17、ventListener监听器 cfg.getSessionEventListenerConfig().setLoadEventListener ( new MyLoadListener() ); /注册saveListener监听器 cfg.getSessionEventListenerConfig().setSaveEventListener (new MySaveListener() ); /由Configuration实例来创建一个SessionFactory实例 sessionFactory = cfg.configure().buildSessionFactory(); 对线程同步

18、如果不想修改代码,也可以在配置文件中使用事件监听器,注册事件监听器的Hibernate配置文件代码如下:!- Hibernate配置文件的文件头,包含DTD等信息 -DOCTYPE hibernate-configuration PUBLIC-/Hibernate/Hibernate Configuration DTD 3.0/EN dtd- Hibernate配置文件的根元素 -hibernate-configuration 设置数据库驱动 -property name=connection.driver_classcom.mysql.jdbc.Driver/property- 数据库服务的url -connection.urljdbc:mysql:/localhost/hibernate- 数据库服务的用户名 -

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1