EntityManager注入 - NullPointerException

时间:2010-11-09 10:02:14

标签: java spring jpa dao criteria-api

在我的Spring + JPA / Hibernate + Wicket应用程序中,我有一个QueryBuilder bean,我想在我的一个DAO中使用它,它在Criteria API的帮助下生成一个类型化查询:

@Service(value="inboxQueryBuilder")
public class InboxQueryBuilder {

    @PersistenceContext
    EntityManager em;

    CriteriaBuilder cb;

    public InboxQueryBuilder() {
        cb = em.getCriteriaBuilder();
    }

    public TypedQuery<App> getQueryForApps(AppSearchObject aso) {
           ...
    }

    ...
}

然而,当我运行应用程序时,我得到一行的空指针异常:

cb = em.getCriteriaBuilder();

即。 EntityManager不会被注入。你知道为什么吗?

此外,这是正确的和线程安全的,还是我应该为每个查询实例化我的InboxQueryBuilder?在这种情况下,我是否还应该注入EntityManager或者我应该将它作为构造函数参数传递(InboxQueryBuilder将为DAO中的每个查询实例化,其中有一个注入的EntityManager实例)?

3 个答案:

答案 0 :(得分:10)

您无法在构造函数中访问EntityManager。看一下@ PostConstruct-Annotation

@Service(value="inboxQueryBuilder")
public class InboxQueryBuilder {

@PersistenceContext
EntityManager em;

CriteriaBuilder cb;

public InboxQueryBuilder() {
    // em= null
}

@PostConstruct
public void toSomething(){
    // em set by Container  
    cb = em.getCriteriaBuilder();
}


public TypedQuery<App> getQueryForApps(AppSearchObject aso) {
       ...
}

...
}

修改 再次阅读你的帖子后,如果我是对的,我开始变得不确定。我知道JBoss中的Java EE-Dependency-Injection正如我所描述的那样工作,但我不确定spring-IOC。

答案 1 :(得分:0)

你的应用程序上下文中是否有这个bean?

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
  <property name="persistenceUnitName" value="myPersistenceUnit"/>
</bean>

答案 2 :(得分:0)

Spring使用Java Beans机制,所以我很确定这是不够的:

@PersistenceContext
EntityManager em;

以下是标准方式:

private EntityManager entityManager;

@PersistenceContext
public void setEntityManager(final EntityManager entityManager){
    this.entityManager = entityManager;
}