JPA实体持续不保存到DB

时间:2016-03-09 01:23:32

标签: java jpa

编辑所以,我从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方法,并且如果我得到了正确的事务,则插入工作正常。我错过了什么?

2 个答案:

答案 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 我认为答案应该有所帮助。

因此,我同意尼古拉斯关于分离责任的意见。