我想從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()
爲什麼?只需使用數據源來獲取它... – 2014-09-05 08:29:46