SessionFactory sf = cfg.buildSessionFactory();
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
//创建一个News对象
News news = new News();
news.setTitle("搬校区了..");
news.setContent("明天我们就要搬校区了,真期待啊....");
session.save(news);
News news2 = (News) session.load(News.class, 1);
news2.setTitle("明天就要搬校区了..");
tx.commit();
session.close();
}
程序运行结果如下:

二、事件机制
如果需要响应持久层的某些特殊事件,可以使用Hibernate3的事件框架。该事件系统可以用来替代拦截器,也可以作为拦截器的补充来使用。
Session接口的每个方法都有相对应的事件。比如 LoadEvent,FlushEvent,等等。当某个方法被调用时,Hibernate Session会生成一个相对应的事件并激活所有配置好的事件监听器。
系统默认监听器实现的处理过程,完成了所有的数据持久化操作,包括插入、修改等操作。如果用户自己定义了自己的监听器,则意味着用户必须完成对象的持久化操作。
监听器是单例模式对象,即所有同类型的事件处理共享同一个监听器实例,因此监听器不应该保存任何状态,即不应该使用成员变量。
使用事件系统按如下步骤:
1、实现自己的事件监听器
2、注册自定义事件监听器,代替系统默认的事件监听器
实现用户的自定义监听器有如下三种方法:
1、实现对应的监听器接口。实现接口必须实现接口内的所有方法,关键是必须事件Hibernate对应的持久化操作,即数据库访问,这意味着程序员完全取代了Hibernate的底层操作。
2、继承事件适配器。可以选择性地实现需要关注的方法,但依然试图取代Hibernate完成数据库的访问。
3、继承系统默认的事件监听器。扩展特定方法。
下面是自定义监听器实例:
[java]
public class MyLoadListener extends DefaultLoadEventListener {
//在LoadEventListener接口仅仅定义了这个方法
public void onLoad(LoadEvent event,LoadEventListener.LoadType loadType) throws HibernateException{
System.out.println("自定义的load事件");
System.out.println(event.getEntityClassName()+"------"+event.getEntityId());
super.onLoad(event, loadType);
}
}
[html]
public class MySaveListener extends DefaultSaveEventListener{
protected Serializable performSaveOrUpdate(SaveOrUpdateEvent event){
System.out.println("自定义的save事件");
System.out.println(event.getObject());
return super.performSaveOrUpdate(event);
}
}
注意:扩展用户自定义监听器时,别忘了在方法中调用父类的对应的方法,否则Hibernate3默认的持久化行为都会失效。
注册用户自定义监听器有两种方法:
1、编程式。通过使用Configuration对象来编程实现注册。
[java]
public void newsListenerTest(){
Configuration conf = new Configuration().configure();
//为load事件设置监听器
conf.setListener("load", "com.hibernate.filter.MyLoadListener");
conf.setListener("save", "com.hibernate.filter.MySaveListener");
SessionFactory sfg = conf.buildSessionFactory();
Session session = sfg.openSession();
Transaction tx = session.beginTransaction();
News news = new News();
news.setContent("2222");
news.setTitle("1111");
session.save(news); //调用save方法,触动save监听器
tx.commit();
session.load(News.class, 1); //调用load方法,触动load监听器
session.close();
}
2、声明式。在hibernate.cfg.xml配置文件中进行声明。
注册事件监听器使用
[html]
如果需要为指定事件配置多个事件监听器,则需要使用
[html]
作者:chenssy