【发布时间】:2016-03-09 01:23:32
【问题描述】:
编辑 所以,我从 Glassfish 切换到 Wildfly,并使用 EclipseLink 2.5。当我切换时,此代码停止工作,出现以下问题。由于某种原因,实体管理器是使用资源本地事务创建的。
我尝试了很多东西,但是当我切换到 Hibernate EM 时,一切正常。 结束编辑
我正在使用 Wildfly 10 和 Eclipselink JPA 让一个简单的无状态 EJB 将记录保存到数据库。方法在这里:
这个bean被标记为@Stateless
@POST
@Override
@Consumes({"application/xml", "application/json"})
public void create(Actor entity) {
L.info("Creating {}", entity);
super.create(entity);
L.info("Created");
}
这里是抽象父类的方法:
public void create(T entity) {
//getEntityManager().getTransaction().begin();
getEntityManager().persist(entity);
//getEntityManager().flush();
//getEntityManager().getTransaction().commit();
}
如果我取消注释事务代码,它可以工作。
如果我添加事务注释,它不起作用。
这样不行。
为什么?我虽然 EJB 得到了容器管理的事务,并且这应该是自动提交的。这是我的持久性单元定义:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="net.mikeski_auth_war_0.1.0-SNAPSHOTPU" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>java:jboss/datasources/PostgresqlDS</jta-data-source>
<class>entities.Actor</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="eclipselink.weaving" value="false"/>
<property name="eclipselink.weaving.fetchgroups" value="false"/>
<property name="javax.persistence.schema-generation.database.action" value="create"/>
</properties>
</persistence-unit>
</persistence>
我知道我的实体很好,因为如果我将一些添加到数据库中,则查找方法会起作用,如果我得到正确的事务,则插入会起作用。我错过了什么?
【问题讨论】:
-
尝试将其标记为@Transactional
-
你能贴出事务注释的应用上下文文件吗
-
不起作用。我在抽象类的方法和实现方法上都试过了,还有类上的
@TransactionManagement(TransactionManagementType.CONTAINER) -
@Sanj - 不是 spring,只是 jpa
-
看看 getEntityManager().joinTransaction() 是否有帮助。你也可以发布 getEntityManager() 源