我有几个JPA实体,它们是在JAX-RS方法中创建和持久化的。我有一个工作线程,随着时间的推移处理JPA中这些实体的一些数据,虽然我可以传入Entity对象,但我无法对它们进行任何更改,因为进行更改的线程中的EntitityManager始终为null。 / p>
包含我的工作线程的类声明为:
public final class EntityService {
@PersistenceContext(type = PersistenceContextType.EXTENDED)
EntityManager entityManager;
EntityManager始终为null,即使它从JAX-RS方法传入,因为当线程有机会尝试使用EM时,EM为空,因为JAX-RS方法已经终止。
如果注入不起作用,如何将有效的实体管理器添加到我的服务pojo中?我正在使用Hibernate和Wildfly 10
答案 0 :(得分:1)
EntityService
才能注入EntityManager
。例如:添加@LocalBean
注释并将EntityService
注入REST
服务类。
此外,我不确定制作class EntitySercice
final
是否是个好主意。
答案 1 :(得分:0)
简而言之,您只能将EntityManager
注入EJB。 If you're EJB is not Stateful
, it won't work with an EXTENDED
persistence context。相反,你会选择一个跨性别的:
@Stateless
public class myService{
@PersistenceContext(type = PersistenceContextType.TRANSACTION)
protected EntityManager em;
}
我还没有尝试this option,但您可以将您的REST资源注释为Stateless
,这样您就可以注入EntityManager
如果您不使用EJB,那么您需要inject the EntityManagerFactory
as shown in this answer :(以下是复制的代码)
package com.test.service;
import java.util.*;
import javax.persistence.*;
import javax.ws.rs.*;
@Path("/service")
public class TestService {
@PersistenceUnit(unitName = "test")
private EntityManagerFactory entityManagerFactory;
@GET
public List get() {
EntityManager entityManager = entityManagerFactory.createEntityManager();
try {
// do something with entityManager
} finally {
entityManager.close();
}
}
}
两个评论:
@PersistenceUnit
,而非@PersistenceContext
答案 2 :(得分:0)
我遇到了这个问题,因为我从pom.xml中省略了初学者-父母
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
</parent>
尽管我使用的是PersistenceContextType.EXTENDED
而不是PersistenceContextType.TRANSACTION
。