一、hibernate 监听器和拦截器
1、拦截器(Intercept):拦截操作,在Hibernate做出动作之前会调用的方法。在Hibernate操作数据库之前可以对入库操作进行影响,比如某个属性的值可以进行修改。
2、监听器(Listener):监听,监视Hibernate 对PO的操作,不能对操作影响,不能影响被监控操作的行为。
二、hibernate 监听器
1、监听器例子:
public class MyListener extends DefaultLoadEventListener
implements PostUpdateEventListener {
public void onPostUpdate(PostUpdateEvent event) {
System.out.println(event.getEntity().getClass().getName()+":更新完 ");
for (int i = 0; i < event.getState().length; i++) {
// 更新前的值
Object oldValue = event.getOldState()[i];
// 更新后的新值
Object newValue = event.getState()[i];
//更新的属性名
String propertyName = event.getPersister().getPropertyNames()[i];
}
}
}
其他监听器,只需实现其他的监听器接口即可,具体有哪些监听器,可以查看Hibernate
包下的org.hibernate.event,里面能看到所有的监听器。
2、监听器spring注入sessionFactory 配置:
定义bean:
<bean id="myListener" class="com.app.common.util.hibernateSupport.MyListener">
在sessionFactory中配置:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> ... <property name="eventListeners"> <map> <entry key="post-update"> <ref bean="myListener" /> </entry> </map> </property> ... </bean>
当Hibernate执行update操作时,就会输出我们的信息了。
三、拦截器
新建一个自己的拦截器类,继承自org.hibernate.EmptyInterceptor类,重写原来的方法,在spring
中配置。
class MyIntercept extends EmptyInterceptor {
@Override
public boolean onSave(Object entity, Serializable id, Object[] state,
String[] propertyNames, Type[] types) {
// entity 就是当前的实体对象
// 如果当前操作的 TbUser ,则做处理
if (entity instanceof TbUser) {
TbUser user = (TbUser) entity;
user.setUserPassword("123");
if (user.getUserId() == null) {
// 返回 true 则拦截本次操作
return
true;
}
}
return
super.onSave(entity, id, state, propertyNames, types);
}
}
配置文件:
<bean id="myIntercept" class="com.app.common.util.hibernateSupport.MyIntercept"> ....... <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> ... <property name="entityInterceptor"> <ref bean="myIntercept" /> </property> ... </bean>