3

Spring+JPA/Hibernate+Wicket アプリには、Criteria API を使用して型指定されたクエリを生成する DAO の 1 つで使用したい QueryBuilder Bean があります。

@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 も注入する必要がありますか、それともコンストラクター パラメーターとして渡す必要がありますか (EntityManager のインスタンスが注入された DAO 内のクエリごとに InboxQueryBuilder がインスタンス化されます)。

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

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 に答える
0

アプリケーションコンテキストのどこかにこの Bean がありますか?

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