使用@PersistenceContext

时间:2016-05-09 18:08:20

标签: java spring hibernate hibernate-entitymanager

我正在尝试创建一个EntityManager的审核服务。但是,当我运行应用程序时,永远不会初始化此EntityManager,因此在调用它时,它会抛出NullPointerException

我的代码如下所示:

import org.springframework.stereotype.Service;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;


@Service
public class AuditServiceImpl implements AuditService {

    private static final String FULL_NAME = "%s %s";

    @PersistenceContext
    private EntityManager entityManager;

    public EntityManager getEntityManager(){
        return entityManager;
    }
}

我预计@PersistenceContext注释会为我解决这个问题,但事实并非如此。我看到其他一些关于类似问题的帖子,但大多数解决方案似乎已经过时了,所以我决定创建另一篇文章。

任何人都可以对这个问题有所了解,甚至可能是一个解决方案吗?

2 个答案:

答案 0 :(得分:0)

首先,请确保正确设置EntityManagerFactory和持久性单元。一个简单的XML样式就像:

<context:component-scan base-package="..." />
<bean id="myEmf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
  <property name="persistenceUnitName" value="yourPersistenceUnit" />
</bean>

但是从下面的评论中可以看出问题是如何引用AuditServiceImpl的原因。基本上,使用AuditService的客户端应该从Spring IoC容器获取引用,而不是实例化对象本身。它可以通过各种方式完成,例如,如果您通过XML样式在独立应用程序中实例化容器,则使用ApplicationContext:

ApplicationContext context =
        new ClassPathXmlApplicationContext(new String[] {"yourApplicationContext.xml"});
AuditService auditService = context.getBean("auditService", AuditService.class);
auditService.doSomething();

如果您使用的是Spring MVC,请将服务注入Web层的客户端。

@Controller
public class MyController {
    @Autowired
    AuditService auditService;

    public void foo() {
        auditService.doSomething();
    }
}

答案 1 :(得分:-1)

不是注入EntityManager,而是在代码中注入EntityManagerFactory

请参阅以下内容:

@PersistenceUnit(unitName = "persistanceUnitName") private EntityManagerFactory entityManagerFactory;

然后获取EntityManager,请执行以下代码:

public EntityManager getEntityManager(){ return entityManagerFactory.createEntityManager(); }