Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA实体保持不保存到数据库_Java_Jpa - Fatal编程技术网

Java JPA实体保持不保存到数据库

Java JPA实体保持不保存到数据库,java,jpa,Java,Jpa,编辑因此,我从Glassfish切换到Wildfly,并使用EclipseLink 2.5。当我切换时,此代码停止工作,出现以下问题。由于某种原因,实体管理器是使用资源本地事务创建的 我尝试了很多东西,但当我切换到冬眠EM时,一切都很好。 结束编辑 我使用Wildfly 10和Eclipselink JPA让一个简单的无状态EJB将记录保存到数据库中。方法如下: 这个bean被标记为@Stateless @POST @Override @Consumes({"application/xml",

编辑因此,我从Glassfish切换到Wildfly,并使用EclipseLink 2.5。当我切换时,此代码停止工作,出现以下问题。由于某种原因,实体管理器是使用资源本地事务创建的

我尝试了很多东西,但当我切换到冬眠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>

org.eclipse.persistence.jpa.PersistenceProvider
java:jboss/datasources/PostgresqlDS
实体。演员
真的

我知道我的实体是好的,因为如果我向数据库中添加一些,find方法就会起作用,如果我得到正确的事务,插入就会起作用。我缺少什么?

我希望您将对象传递给无状态的EJB,即使该EJB只为您调用em.persist。在这里,您正在混合各种功能,您正在让其余部分完成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
}
我认为理解预期的做事方式比理解为什么不寻常的做法不起作用更重要


希望这能有所帮助。

我认为在标有
@Stateless
的bean类中注入
entityManager
应该可以工作

如果您正在其他类(父类)中获取
entitymanager
,请尝试从entitymanager工厂获取它,而不是直接注入它。你已经在超级课堂上做了吗,或者你有一个注入em的getter

可能存在JavaEE版本问题 我认为这个答案应该有帮助


因此,我同意Nicholas关于职责分离的观点。

尝试将其标记为@transactional您可以发布事务性注释的应用程序上下文文件吗。我在抽象类的方法和实现方法以及这两种方法上进行了尝试,并在class@Sanj-如果getEntityManager().joinTransaction()有帮助,则不是spring,而是jpaSee。您还可以发布getEntityManager()source。我之所以使用此设置,是因为这是一种用于从实体生成REST服务的Netbeans模式。他们使用@PersistenceContext注释来创建EM。在这种情况下,我如何构造EntityManager以使其可用?嗨,Mikeb,我想说的是,继续在无状态ejb中使用@PersistenceContext。另外,是的,我通常使用一个Resources实用程序类来生成PersistenceContext以供注入,就像在所有应用程序中一样。另外,我认为hibernate比EclipseLink成熟得多。好的,那么如果不是从@PersistenceContext注释创建实体管理器,我该如何创建呢?@mikeb我的答案中的链接有相关代码。或者,您可以使用Nicolas提到的使用注入注释的示例代码的方法。我也尝试过这种方法,但没有成功。我切换到HibernateJPA,一切正常。我猜是日食和野蝇。