如何在我的非ejb应用程序中使用以下代码.代码有效.
@Override
public void saveItems(Collection<T> items) {
synchronized (em) {
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
for (T item : items) {
saveItem_((Class<T>) null, item);
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在一个新的应用程序中,我正在使用EJB3 + JSF,并希望重用包含上述代码的库.我对新应用程序的持久性单元如下所示:
<persistence-unit name="myApp" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>MySQLConnection</jta-data-source>
</persistence-unit>
Run Code Online (Sandbox Code Playgroud)
我的新应用程序在遇到此行时抛出异常:
EntityTransaction tx = em.getTransaction();
Run Code Online (Sandbox Code Playgroud)
例外是:
A JTA EntityManager cannot use getTransaction()
Run Code Online (Sandbox Code Playgroud)
这很清楚.问题是如何转换我的代码以使容器管理的事务.大概我的bean方法需要适当注释......问题是如何?
我正在使用Spring + JPA + Hibernate + EntityManager与数据库进行通信.我得到'A JTA EntityManager无法使用getTransaction() '错误.请提供您的见解并帮助我解决问题.
beans.xml中
<?xml version="1.0" encoding="UTF-8"?>
<beans default-autowire="byName"
... xmlns definitions...
xsi:schemaLocation="...">
<context:component-scan base-package="com.mycompany.myproject" />
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" />
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="myDAO" class="com.mycompany.myproject.dao.myDAO" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven />
</beans>
Run Code Online (Sandbox Code Playgroud)
persistence.xml中
<?xml version="1.0" encoding="UTF-8"?>
<persistence ... xmlns definitions xsi:schemaLocation="..." version="1.0">
<persistence-unit name="TEST_DS">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/TEST_DS</jta-data-source>
<class>com.twinspires.exchange.model.Test</class>
<properties>
<property name="hibernate.archive.autodetection" value="class, hbm" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="validate" /> <!-- create-drop update -->
<property …Run Code Online (Sandbox Code Playgroud)