3

在我的 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 实例的每个查询实例化)?

4

3 回答 3

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。

于 2010-11-09T11:23:19.247 回答
0

您的应用程序上下文中是否有此 bean?

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
  <property name="persistenceUnitName" value="myPersistenceUnit"/>
</bean>
于 2010-11-09T10:27:28.537 回答
0

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

@PersistenceContext
EntityManager em;

这是标准方法:

private EntityManager entityManager;

@PersistenceContext
public void setEntityManager(final EntityManager entityManager){
    this.entityManager = entityManager;
}
于 2010-11-09T10:31:14.583 回答