gpt4 book ai didi

java - JPA实体持续不保存到数据库

转载 作者:行者123 更新时间:2023-12-01 10:16:10 27 4
gpt4 key购买 nike

编辑 因此,我从 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>

我知道我的实体很好,因为如果我向数据库添加一些实体,查找方法就会起作用,如果我得到正确的事务,插入就会起作用。我错过了什么?

最佳答案

我希望您将对象传递给无状态 EJB,即使该 EJB 除了为您调用 em.persist 之外什么也不做。在这里,您正在混合功能,您正在让 REST 完成 EJB 的工作,并且可能有些事情您(和我)尚未完全理解。此外,服务层无状态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
}

我认为理解预期的做事方式比理解为什么不寻常的方法不起作用更重要。

希望这有帮助。

关于java - JPA实体持续不保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35881251/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com