EntitityManager未正确注入,始终为null

时间:2017-10-13 19:39:39

标签: java multithreading hibernate jpa

我有几个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

3 个答案:

答案 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

的EntityManagerFactory

如果您不使用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();
        }
    }
}

两个评论:

答案 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