3

ストアド プロシージャの実行を担当するクラスがあり、JTA を使用していたときは正常に動作していました...しかし、再デプロイに問題があるため、JTA を削除し、Spring でローカル エンティティ マネージャーを使用しています。

 <bean id="entityManagerFactoryErp" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="erpPU"/>
</bean>
<bean id="entityManagerErp" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
    <property name="entityManagerFactory" ref="entityManagerFactoryErp"/>
</bean> 

アクティブなセッションを取得しようとすると、NullPointerException が発生します。

public class ExecutadorProcedimentoArmazenado extends BaseDao implements IExecutadorProcedimentoArmazenado {

    public boolean executar(String nomeProcedimento) {
        DataReadQuery query = configurarQuery(nomeProcedimento);
        registro = executarProcedimento(query);
        int resultado = Integer.parseInt(recuperarValorDeSaida("RESULTADO"));
        mensagem = recuperarValorDeSaida("MSGERRO");
        return resultado == 0;
    }
    .
    .
    private Session configurarSessao() {
        JpaEntityManager jpaEntityManager = JpaHelper.getEntityManager(entityManager);
        return jpaEntityManager.getActiveSession();
    }
    .
    .
    .
}

追加した

おそらく問題は、entityManager にトランザクションがないことです。Spring AOP でトランザクションを作成しようとしていますが、他のすべてのクラスでは機能しますが、インターフェイス IExecutadorProcedimentoArmazenado では機能しません。

<bean id="entityManagerFactoryErp" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="erpPU"/>
</bean>

<bean id="entityManagerErp" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
    <property name="entityManagerFactory" ref="entityManagerFactoryErp"/>
</bean>

<bean id="transactionManagerErp"
      class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactoryErp"/>
</bean>

<tx:advice id="txExecutadorProcedimento" transaction-manager="transactionManagerErp">
    <tx:attributes>
        <tx:method name="executar" rollback-for="Exception" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="operacoesExecutadorProcedimento" expression="execution(* com.hrgi.persistencia.IExecutadorProcedimentoArmazenado.executar(..))"/>
    <aop:advisor advice-ref="txExecutadorProcedimento" pointcut-ref="operacoesExecutadorProcedimento"/>
</aop:config>

誰かがストアドプロシージャを呼び出してセッションを取得できない理由を説明してもらえますか??

4

2 に答える 2

5

これを行う春の方法は、単にアノテーションを挿入しEntityManager@PersistenceContextデリゲートを返すことです...

public class ExecutadorProcedimentoArmazenado extends BaseDao implements IExecutadorProcedimentoArmazenado {

  @PersistenceContext
  private EntityManager entitymanager

  private Session configurarSessao() {
    return ((JpaEntityManager) entityManager.getDelegate()).getActiveSession();
  }

アクティブなセッションが null の場合、アクティブなセッションがないことを意味します。私はこれをテストし、トランザクションの外で、NPE を提供します。トランザクション内では、上記のコードが機能します。Spring 3.1 / Eclipselink 2.0 でテスト済み。

于 2012-08-14T16:57:17.577 に答える
0

この場合のコンテナーは Spring であり、entityManager.getDelegate() から null を返す可能性が高いため、jpaEntityManager.getActiveSession() で NPE が発生します。代わりに、トランザクションを開始するか、ラップされていない EclipseLink EntityManagerFactory から直接 EntityManager を取得してみてください。

于 2012-08-14T15:12:41.000 に答える