bre*_*leq 3 aop spring persistence eclipselink jpa-2.0
我有一个负责执行存储过程的类,当我使用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>
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试获取活动会话时,我收到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();
}
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
添加
可能的问题是,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>
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下为什么我无法为我调用Session来调用存储过程吗?
这样做的春天方法是简单地注入EntityManager与@PersistenceContext注释,并返回委托...
public class ExecutadorProcedimentoArmazenado extends BaseDao implements IExecutadorProcedimentoArmazenado {
@PersistenceContext
private EntityManager entitymanager
private Session configurarSessao() {
return ((JpaEntityManager) entityManager.getDelegate()).getActiveSession();
}
Run Code Online (Sandbox Code Playgroud)
如果活动会话为null,则表示没有活动会话。我在交易之外进行了测试,它给出了NPE。在事务内部,上面的代码有效。在Spring 3.1 / Eclipselink 2.0上进行了测试。
| 归档时间: |
|
| 查看次数: |
5316 次 |
| 最近记录: |