【问题标题】:Cant persist data: A JTA EntityManager cannot use getTransaction()无法持久化数据:JTA EntityManager 无法使用 getTransaction()
【发布时间】:2016-07-18 14:44:59
【问题描述】:

在尝试持久化实体时,出现以下异常。

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>

【问题讨论】:

  • 该设置中的 Jboss 应负责处理事务。详细信息取决于您的设置。 EJB?
  • @ep 由于这是一个 JTA 管理,我们不能使用 getTransaction() 方法。虽然我从未尝试过,但我最好的猜测是,我认为正确的做法是从 JNDI 查找中获取 UserTransaction 并使用 to 提交/回滚。您是在 JBoss 服务器中运行此代码还是独立应用程序?
  • @mh-dev : 它不是 EJB
  • @MadhusudanaReddySunnapu:部署在 WildFly 9 服务器上
  • @ep 然后你可能想尝试注入或 JNDI 查找 UserTransaction 并使用它来控制事务而不是 getTransaction()

标签: hibernate jpa


【解决方案1】:

如果您尝试在 Wildfly 上进行部署,请使用 @PersistenceContext 注释获取您的 EntityManager。所有 Wildfly 快速入门都有一个实用程序类,@Produces 实体管理器将被注入其他 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;

有用的交叉引用:How to inject EntityManager in CDI (weld)?

【讨论】:

    猜你喜欢
    • 2012-06-13
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多