Hibernate 无法持久化数据:JTA EntityManager无法使用getTransaction()
在尝试持久化实体时,我得到以下异常Hibernate 无法持久化数据:JTA EntityManager无法使用getTransaction(),hibernate,jpa,Hibernate,Jpa,在尝试持久化实体时,我得到以下异常 public class MyClass { EntityManagerFactory emFactory; EntityManager entityManager; public MyClass(){ emFactory = Persistence.createEntityManagerFactory("persistenceUnit"); entityManager = emFactory.cre
public class MyClass {
EntityManagerFactory emFactory;
EntityManager entityManager;
public MyClass(){
emFactory = Persistence.createEntityManagerFactory("persistenceUnit");
entityManager = emFactory.createEntityManager();
}
public void getData() {
try {
TrigData trigData = new TrigData();
trigData.setKey("abc");
entityManager.getTransaction().begin();
entityManager.persist(trigData);
entityManager.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
}
}
19:31:51,508 ERROR [stderr] (default task-6) java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction()
19:31:51,508 ERROR [stderr] (default task-6) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.getTransaction(AbstractEntityManagerImpl.java:1368)
19:31:51,509 ERROR [stderr] (default task-6) at com.xyz.services.MyClass.getData(MyClass.java:42)
19:31:51,509 ERROR [stderr] (default task-6) at com.xyz.services.MyClass$Proxy$_$$_WeldClientProxy.getData(Unknown Source)
19:31:51,509 ERROR [stderr] (default task-6) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
19:31:51,510 ERROR [stderr] (default task-6) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
19:31:51,510 ERROR [stderr] (default task-6) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
19:31:51,510 ERROR [stderr] (default task-6) at java.lang.reflect.Method.invoke(Method.java:606)
19:31:51,510 ERROR [stderr] (default task-6) at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
19:31:51,511 ERROR [stderr] (default task-6) at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$VoidOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:167)
19:31:51,511 ERROR [stderr] (default task-6) at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
19:31:51,511 ERROR [stderr] (default task-6) at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
19:31:51,512 ERROR [stderr] (default task-6) at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
19:31:51,512 ERROR [stderr] (default task-6) at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
19:31:51,513 ERROR [stderr] (default task-6) at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
persistence.xml:
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="persistenceUnit" >
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/datasources/PostgresDS</jta-data-source>
<class>com.xyz.TrigData</class>
<properties>
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
org.hibernate.ejb.HibernatePersistence
java:jboss/datasources/postgresd
com.xyz.TrigData
如果您试图在Wildfly上部署,请使用@PersistenceContext
注释获取您的EntityManager
。所有的Wildfly QuickStart都有一个实用程序类,@生成要注入到其他bean中的实体管理器:
public class Resources {
@Produces
@PersistenceContext
private EntityManager em;
@Produces
public Logger produceLog(InjectionPoint injectionPoint) {
return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
}
@Produces
@RequestScoped
public FacesContext produceFacesContext() {
return FacesContext.getCurrentInstance();
}
}
它的使用方式如下:
@Stateless
public class Service {
@Inject
private EntityManager em;
有帮助的交叉引用:Jboss在该设置中应该负责处理事务。详细信息取决于您的设置。EJB?@ep因为这是一个JTA管理的,所以我们不能使用getTransaction()
方法。尽管我从未尝试过,但我的最佳猜测是,我认为正确的方法是从JNDI查找中获取UserTransaction
,并使用提交/回滚。你是在JBoss服务器上运行这段代码,还是它是StanLone应用程序?@mh-dev:不是EJB@MadhusudanaReddySunnapu:它部署在WildFly 9上server@ep然后,您可能希望尝试使用inject或对UserTransaction
执行JNDI查找,并使用它来控制事务,而不是getTransaction()
。