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; }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。