2015-06-30 101 views
1

我想從舊式的TransactionProxyFactoryBean事務管理遷移到春季推薦的聲明式事務管理。 這樣就可以避免不時出現的交易出現異常情況。從TransactionProxyFactoryBean到聲明式事務管理?

這是我的XML配置文件:

<beans xmlns=...> 

    <context:annotation-config/> 
    <context:component-scan base-package="prof" /> 

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
     <property name="configLocation"> 
      <value>WEB-INF/classes/hibernate.cfg.xml</value> 
     </property> 
    </bean> 

    <import resource="prof-dao-spring.xml" /> 

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

    <bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"> 
     <property name="transactionManager"> 
      <ref bean="transactionManager"/> 
     </property> 
     <property name="transactionAttributes"> 
      <props> 
      <prop key="save*">PROPAGATION_REQUIRED</prop> 
      ... 
      <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="ProfileService" parent="baseTransactionProxy"> 
    <property name="target"> 
     <bean class="tv.clever.hibernate.service.ProfileService"></bean> 
    </property> 
    </bean> 

</beans> 

ProfileService的樣子:

@Component 
public class ProfileService { 

@Autowired 
@Qualifier("baseDAO") 
protected BaseDAO baseDAO; 

private static ProfileService profileService; 

public ProfileService() { 

    setProfileService(this); 
} 

public void setProfileService(ProfileService ps) { 

      profileService = ps; 
} 

public void save(final Collection transientObjects) { 

    baseDAO.save(transientObjects); 
} 

... 
} 

從哪裏我要開始?

+1

你想做什麼?使用註釋,即'@ Transactional'?還是仍然在使用XML?小技巧而不是'@ Component'我會建議使用'@ Service'來爲你的daos標記你的服務類和'@ Repository'。什麼是爲自己設置一個靜態引用的裝置,這會讓我的警鐘響起......您當前的設置也複製了所有的豆子?你有組件掃描和手動配置,你基本上爲每個bean創建2個實例(不包括代理)。 –

+0

是的,我想要一個'Annotation style transaction'就像這個例子(1. Annotation style transaction):http://simplespringtutorial.com/springDeclarativeTransactions.html區別在於我使用Hibernate框架'HibernateTransactionManager' – Dylan

+1

哪個事務管理器沒關係。 –

回答

3

假設您希望在服務類上使用註釋a @Transactional,請將<tx:annotation-driven />添加到您的配置中,並刪除TransactionalProxyFactoryBean聲明以及將其作爲父項的所有bean。

其他親提示:

  1. 使用@Service服務類和@Repository爲DAOS
  2. <context:annotation-config /><context:component-scan />

您的服務

@Service 
@Transactional 
public class ProfileService { ... } 

配置暗示

<beans xmlns=...> 

    <context:component-scan base-package="prof" /> 

    <import resource="prof-dao-spring.xml" /> 

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
     <property name="configLocation"> 
      <value>WEB-INF/classes/hibernate.cfg.xml</value> 
     </property> 
    </bean> 

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

    <tx:annotation-driven /> 

</beans> 

重新啓動應用程序。

+0

要了解交易陷阱,我會推薦這篇文章:http://www.ibm.com/developerworks/java/library/j-ts1/index.html – Dylan