Hibernate读书笔记-----事件机制
Hibernate执行持久化过程中,应用程序无法参与其中。所有的数据持久化操作,对用户都是透明的。
通过事件框架,Hibernate允许应用程能响应特定的内部事件,从而允许实现某些通用的功能或者对Hibernate功能进行扩展。
Hibernate的事件机制框架由两个部分组成:
1、易做图机制:对于特定动作拦截,回调应用中的特定动作
2、事件系统:重写Hibernate的事件易做图。
一、易做图
Interceptor接口提供了从会话回调应用程序的机制,这种回调机制可以允许应用程序在持久化对象被保存、更新、删除或是加载之前,检查并(或)修改其属性。
通过Interceptor接口,可以在数据进入数据库之前,对数据进行最后的检查,如果数据不符合要求,可以修改数据,从而避免非法数据进入数据库。
使用易做图按如下两个步骤进行:
1、定义实现Interceptor接口的易做图
2、通过Session启用易做图,或者通过Configuration启用全局易做图
程序可以通过实现Interceptor接口来创建易做图,也可以通过继承EmptyInterceptor来实现易做图。
[java]
public class MyIterceptor extends EmptyInterceptor {
// 记录修改次数
private int updates;
// 记录创建次数
private int creates;
// 当删除实体时,onDelete方法将被调用
public void onDelete(Object entity, Serializable id, Object[] state,
String[] propertyNames, Type[] types) {
// do nothing
}
// 当把持久化实体的状态同步到数据库时,onFlushDirty方法被调用
public boolean onFlushDirty(Object entity, Serializable id,
Object[] currentState, Object[] previousState,
String[] propertyNames, Type[] types) {
// 每同步一次,修改的累加器加1
updates++;
for (int i = 0; i < propertyNames.length; i++) {
if ("lastUpdateTimestamp".equals(propertyNames[i])) {
currentState[i] = new Date();
return true;
}
}
return false;
}
// 当加载持久化实体时,onLoad方法被调用
public boolean onLoad(Object entity, Serializable id, Object[] state,
String[] propertyNames, Type[] types) {
for (int i = 0; i < propertyNames.length; i++) {
if ("name".equals(propertyNames[i])) {
// 输出被装载实体的name属性值
System.out.println(state[i]);
return true;
}
}
return false;
}
// 保存持久化实例时候,调用该方法
public boolean onSave(Object entity, Serializable id, Object[] state,
String[] propertyNames, Type[] types) {
creates++;
for (int i = 0; i < propertyNames.length; i++) {
if ("createTimestamp".equals(propertyNames[i])) {
state[i] = new Date();
return true;
}
}
return false;
}
// 持久化所做修改同步完成后,调用postFlush方法
public void postFlush(Iterator entities) {
System.out.println("创建的次数: " + creates + ", 更新的次数: " + updates);
}
// 在同步持久化所做修改之前,调用preFlush方法
public void preFlush(Iterator entities) {
}
// 事务提交之前触发该方法
public void beforeTransactionCompletion(Transaction tx) {
System.out.println("事务即将结束");
}
// 事务提交之后触发该方法
public void afterTransactionCompletion(Transaction tx) {
System.out.println("事务已经结束");
}
}
上面易做图没有进行实际的操作,只是打印了一些标识代码。
易做图可以有两种:Session范围内的,和SessionFactory范围内的。
当使用某个重载的SessionFactory.openSession()使用Interceptor作为参数调用打开一个session的时候,就指定了Session范围内的易做图。
[java]
Session session = sf.openSession( new MyInterceptor() );
SessionFactory范围内的易做图要通过Configuration中注册,而这必须在创建SessionFactory之前。在这种情况下,给出的易做图会被这个SessionFactory所打开的所有session使用了
[java]
new Configuration().setInterceptor( new MyInterceptor() );
补充:软件开发 , Java ,