2011-09-07 103 views
0

我是一個新手來休眠和春天,並試圖學習使用hibernate攔截器。 我通過社區文檔它說,去了....什麼是Hibernate攔截器和proxyTargetClass的使用

這個攔截器綁定一個新的Hibernate Session到線程 方法調用之前,關閉和以任何方法 結果的情況下,隨後將其移除。如果已經存在預先綁定的會話(例如,從 HibernateTransactionManager或者從周圍的 休眠攔截方法),則攔截器僅僅參與 它。

但我無法理解我們什麼時候使用這個,爲什麼我們使用它?

什麼時候創建taskDao像這樣?

<bean name="abstractDao" abstract="true"> 
     <property name="hibernateTemplate" ref="taskHibernateTemplate"/> 
    </bean> 
<bean id="taskHibernateInterceptor" class="org.springframework.orm.hibernate3.HibernateInterceptor"> 
     <property name="sessionFactory" ref="taskSessionFactory"/> 
    </bean> 

<bean id="taskDaoTarget" class="com.xyz.abc.backgroundtask.impl.TaskDao" parent="abstractDao"/> 

<bean id="taskDao" class="org.springframework.aop.framework.ProxyFactoryBean"> 
    <property name="proxyTargetClass" value="true"/> 
    <property name="interceptorNames"> 
     <list> 
      <value>taskHibernateInterceptor</value> 
      <value>taskDaoTarget</value> 
     </list> 
    </property> 
</bean> 

什麼時候創建taskDao像這樣?

<bean name="abstractDao" abstract="true"> 
     <property name="hibernateTemplate" ref="taskHibernateTemplate"/> 
    </bean> 

<bean id="taskDao" class="com.xyz.zbc.backgroundtask.impl.TaskDao" parent="abstractDao"/> 

回答

2

您是否必須使用Hibernate Interceptor?因爲我建議你改用Spring的(基於註解的)Declarative Transaction Management。對於許多受支持的基礎技術而言,這是一種常見的抽象。

基本上,你要做的就是定義一個事務管理的Bean,在休眠與JPA的情況:

<bean id="transactionManager" 
    class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="myEmf"/> 
</bean> 

沒有JPA:

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 

在這兩種情況下,激活基於註解的交易:或者,如果您不使用接口:

<tx:annotation-driven proxy-target-class="true" /> 

現在使用@Transactional註釋您的服務層方法或類,您將自動獲取在服務方法範圍內創建的會話。

我建議你不要使用HibernateInterceptor和HibernateTemplate,它們都不是現代的做事方式了。

閱讀:

而且,看慣的東西如何在春天做: