编辑所以,我从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>
我知道我的实体很好,因为如果我在数据库中添加了一些find方法,并且如果我得到了正确的事务,则插入工作正常。我错过了什么?
答案 0 :(得分:1)
我希望您将对象传递给Stateless
EJB,即使该EJB只为您调用em.persist也是如此。在这里,您正在混合功能,您正在使REST执行EJB的工作,并且可能存在您(和我)尚未完全理解的事情。此外,service layer
无状态ejb可能还有其他功能,所以它肯定不是浪费。
@Inject ActorService actorService;
@POST
@Consumes({"application/xml", "application/json"})
public void create(Actor entity) {
L.info("Creating {}", entity);
actorService.create(entity);
L.info("Created");
}
,大概是:
@Stateless
public class ActorService {
@Inject private EntityManager em;
public create(Actor actor) {
em.persist(actor);
}
.. the rest of the actor service layer
}
我认为理解预期的做事方式比了解异常行为不起作用更为重要。
希望这有帮助。
答案 1 :(得分:0)
我认为在标有entityManager
的bean类中注入@Stateless
应该可以。
如果你在其他类(父类)中获得entitymanager
,请尝试从entityManagerFactory获取它而不是直接注入它。你是否已经在超级课程中这样做了,或者你是否有注射em的吸气剂。
可能存在java ee版本问题as discussed in an answer here 我认为答案应该有所帮助。
因此,我同意尼古拉斯关于分离责任的意见。