Java 如何从Spring上下文中配置的EntityManager获取连接?

Java 如何从Spring上下文中配置的EntityManager获取连接?,java,spring,jpa,transactions,dbunit,Java,Spring,Jpa,Transactions,Dbunit,我想从spring上下文中配置的EntityManager获取连接,以便在dbunit DatabaseOperation.CLEAN_INSERT.execute方法中使用它 以下是Spring配置: <bean id="testmEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <qualifier value="test

我想从spring上下文中配置的EntityManager获取连接,以便在dbunit DatabaseOperation.CLEAN_INSERT.execute方法中使用它

以下是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>
我收到异常
org.hibernate.SessionException:会话已关闭

当我使用
emager.getTransaction().begin()时
我得到
java.lang.IllegalStateException:不允许在共享EntityManager上创建事务-改用Spring事务或EJB CMT

已解决: 已使用数据源获取它:

@Autowired
private DataSource dataSource;


在Spring中有两种使用事务的标准方法:

  • 在方法上使用
    @Transactional
    注释

  • 使用方法

  • 第二种方法使您可以使用单个方法执行多个事务。您不必手动启动和停止事务


    数据库连接仅在spring事务单元中处于活动状态,因此在
    @Transactional
    方法中,或者在
    TransactionTemplate.execute()的回调方法中,为什么?只需使用数据源获取它。。。
    
    @Autowired
    private DataSource dataSource;
    
    dataSource.getConnection ()