2014-09-05 116 views
2

我想從Spring環境中配置的EntityManager中獲取連接,以便在dbunit DatabaseOperation.CLEAN_INSERT.execute方法中使用它。如何從Spring環境中配置的EntityManager獲取連接?

下面是Spring配置:

<bean id="testmEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <qualifier value="testm" type="org.springframework.beans.factory.annotation.Qualifier"/> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="jpaDialect"><bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/></property> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.hbm2ddl.auto">create</prop> 
      <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop> 
     </props> 
    </property> 
    <property name="jpaVendorAdapter" ref="jpaAdapter"/> 
    <property name="loadTimeWeaver"> 
     <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/> 
    </property> 
</bean> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.SingleConnectionDataSource" 
     p:driverClassName="org.h2.Driver" 
     p:url="jdbc:h2:mem:test;IGNORECASE=TRUE;"> 
    <property name="autoCommit" value="false"/> 
    <property name="suppressClose" value="true"/> 
</bean> 

<bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean> 

<tx:annotation-driven transaction-manager="testmTransactionManager"/> 
<bean id="testmTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <qualifier value="testm"/> 
    <property name="entityManagerFactory" ref="testmEntityManagerFactory"/> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

這裏是代碼:

@javax.persistence.PersistenceContext(unitName = "testm") 
@Qualifier(value = "testm") 
protected javax.persistence.EntityManager emanager; 


@Transactional 
public void setUp() throws Exception { 
    IDatabaseConnection connection = new DatabaseConnection (((SessionImpl)(emanager.getDelegate())).connection()); 

我收到異常org.hibernate.SessionException: Session is closed!

當我使用emanager.getTransaction().begin(); 我得到java.lang.IllegalStateException: Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead

解決: 使用的數據源獲得它:

@Autowired 
private DataSource dataSource; 

dataSource.getConnection() 
+1

爲什麼?只需使用數據源來獲取它... – 2014-09-05 08:29:46

回答

1

有春季使用交易2種規範的方式:

  1. 使用@Transactional註釋上的方法

  2. 使用TransactionTemplate.execute方法

第二屆方法使您能夠執行withing單一方法多筆交易的可能性。然後您不必手動啓動和停止交易。

數據庫連接僅在彈簧交易單元內處於活動狀態,因此在@Transactional方法內,在回調方法內爲TransactionTemplate.execute()

相關問題