生活随笔
收集整理的這篇文章主要介紹了
Hibernate的拦截器和监听器 .
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://blog.csdn.net/shizhan1881/article/details/8478923
最近項目需要,用到了Hibernate的攔截器和監聽器,有些小小心得,和大家分享下。
首先說說這兩個東西。
攔截器(Intercept):顧名思義,攔截操作,也就是在Hibernate做出動作之前會調用的方法。如果你有需要在Hibernate操作數據庫之前想要做的操作,就需要用到這個東西了。
監聽器(Listener):監聽,就是監視Hibernate的一舉一動,如果我們要獲取Hibernate各種操作PO的前前后后的信息,那就要用到他了。
這里有的朋友可能就有疑問了,從上面的描述來看,這個監聽器似乎能夠實現攔截器的功能,因為他也能獲取Hibernate操作數據庫前的狀況。
其實不然,在此我只舉出兩個很典型的例子,大家就會明白他們倆是不能被互相取代的。
1、監聽器只會默默的獲取信息,不會阻斷Hibernate的工作,而用攔截器時,我們可以根據我們的需求,去終止某個Hibernate的持久化動作。
2、如果我有這樣一個需求,在PO保存時,我想按我的需求改變某個屬性的值后,再保存入庫。分析下知道,這個操作要在Hibernate執行Save之前來做,那么看似攔截器和監聽器都能實現,但實踐一下就會知道,如果我們用監聽器來做(比如此時用PreInsertEventListener),當我們在此改變某屬性值后,會發現,保存入庫的仍然是原來的值,監聽器的Pre******是不允許我們這樣做的。此時就需要用到攔截器,實現其OnSave方法,在此進行處理。
說完了這些,就簡單說下他們的用法及配置方法。
一、
首先說監聽器,我們以PostUpdateEventListener講解
新建一個我們自己的監聽器類,實現PostUpdateEventListener接口即可
Java代碼
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];? ??????? }? ??? }? }?
[java] view plaincopyprint?
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];??????????}??????}??}??
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,里面能看到所有的監聽器。
之后要加載監聽器,我這里只講解用過spring注入sessionFactory,用property配置的方法,因為另外的兩種配置方法在網上很容易搜索到,這里就不重復。
先將我們的監聽器定義到spring中
Xml代碼
<bean id="myListener" class="com.app.common.util.hibernateSupport.MyListener">?
[xml] view plaincopyprint?
<bean?id="myListener"?class="com.app.common.util.hibernateSupport.MyListener">??
<bean id="myListener" class="com.app.common.util.hibernateSupport.MyListener">
在sessionFactory的bean標簽中加入如下內容:
Xml代碼
<bean id=
"sessionFactory"?
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">? ...? ??????? <property name="eventListeners">?? ??????????? <map>? ??????????????? <entry key="post-update">? ??????????????????? <ref bean="myListener" />? ??????????????? </entry>? ??????????? </map>? ??????? </property>? ...? </bean>?
[xml] view plaincopyprint?
<bean?id="sessionFactory"???class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">??...??????????<property?name="eventListeners">???????????????<map>??????????????????<entry?key="post-update">??????????????????????<ref?bean="myListener"?/>??????????????????</entry>??????????????</map>??????????</property>??...??</bean>??
<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中配置即可。
簡單例子:
Java代碼
public class MyIntercept
extends EmptyInterceptor {?
????? ??? @Override? ??? public boolean onSave(Object entity, Serializable id, Object[] state,? ??????????? String[] propertyNames, Type[] types) {? ??????? ? ??????? ? ??????? if(entity instanceof TbUser){? ??????????? TbUser user=(TbUser)entity;? ??????????? user.setUserPassword("123");? ??????????? if(user.getUserId()==null){? ??????????????? ? ??????????????? return true;? ??????????? }? ??????? }? ??????? return super.onSave(entity, id, state, propertyNames, types);? ??? }? }?
[java] view plaincopyprint?
public?class?MyIntercept?extends?EmptyInterceptor?{????????????@Override??????public?boolean?onSave(Object?entity,?Serializable?id,?Object[]?state,??????????????String[]?propertyNames,?Type[]?types)?{???????????????????? ??????????if(entity?instanceof?TbUser){??????????????TbUser?user=(TbUser)entity;??????????????user.setUserPassword("123");??????????????if(user.getUserId()==null){????????????????????????????????????return?true;??????????????}??????????}??????????return?super.onSave(entity,?id,?state,?propertyNames,?types);??????}??}??
public class MyIntercept extends EmptyInterceptor {@Overridepublic 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);}
}
配置文件:
Xml代碼
<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>?
[xml] view plaincopyprint?
<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>??
?
總結
以上是生活随笔為你收集整理的Hibernate的拦截器和监听器 .的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。