Hibernate 如何创建一个拦截器呢?
下文讲述Hibernate创建拦截器的方法分享 在Hibernate中,当一个对象将被创建和保持。一旦对象已经被修改,它必须被保存到数据库里。这个过程持续直到下一次对象被需要,它将被从持久的存储中加载。 那么我们如何监控一个对象的不同生命周期的状态呢? 下文将一一道来,如下所示: 在Hibernate中,对象的不同生命周期的状态,由Interceptor接口提供不同的处理方法 拦截器中接口方法如下所示:
创建拦截器示例
| 编号 | 方法和描述 |
| 1 | findDirty() 这个方法在当 flush() 方法在一个 Session 对象上被调用时被调用 |
| 2 | Instantiate() 这个方法在一个持续的类被实例化时被调用 |
| 3 | isUnsaved() 这个方法在当一个对象被传到 saveOrUpdate() 方法时被调用 |
| 4 | onDelete() 这个方法在一个对象被删除前被调用 |
| 5 | onFlushDirty() 这个方法在当 Hibernate 探测到一个对象在一次 flush(例如,更新操作)中是脏的(例如,被修改)时被调用 |
| 6 | onLoad() 这个方法在一个对象被初始化之前被调用 |
| 7 | onSave() 这个方法在一个对象被保存前被调用 |
| 8 | postFlush() 这个方法在一次 flush 已经发生并且一个对象已经在内存中被更新后被调用 |
| 9 | preFlush() 这个方法在一次 flush 前被调用。 Hibernate 拦截器给予了我们一个对象如何应用到应用程序和数据库的总控制 |
import java.io.Serializable;
import java.util.Date;
import java.util.Iterator;
import org.hibernate.EmptyInterceptor;
import org.hibernate.Transaction;
import org.hibernate.type.Type;
public class MyInterceptor extends EmptyInterceptor {
private int updates;
private int creates;
private int loads;
public void onDelete(Object entity,
Serializable id,
Object[] state,
String[] propertyNames,
Type[] types) {
// do nothing
}
// This method is called when Employee object gets updated.
public boolean onFlushDirty(Object entity,
Serializable id,
Object[] currentState,
Object[] previousState,
String[] propertyNames,
Type[] types) {
if ( entity instanceof Employee ) {
System.out.println("Update Operation");
return true;
}
return false;
}
public boolean onLoad(Object entity,
Serializable id,
Object[] state,
String[] propertyNames,
Type[] types) {
// do nothing
return true;
}
// This method is called when Employee object gets created.
public boolean onSave(Object entity,
Serializable id,
Object[] state,
String[] propertyNames,
Type[] types) {
if ( entity instanceof Employee ) {
System.out.println("Create Operation");
return true;
}
return false;
}
//called before commit into database
public void preFlush(Iterator iterator) {
System.out.println("preFlush");
}
//called after committed into database
public void postFlush(Iterator iterator) {
System.out.println("postFlush");
}
}
拦截器的使用 只需在打开一个Session会话时,加入拦截器即可,如下例所示:
public Integer addUser(String name,int salary){
Session session = factory.openSession( new MyInterceptor() );
Transaction tx = null;
Integer userId = null;
try{
tx = session.beginTransaction();
User user = new User(name,salary);
userId = (Integer) session.save(user);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return userId;
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


