试图在spring,具有模式AspectJ的hibernate项目中实现没有成功的@Transactional
使用@Transactional的方法。
@Transactional
public void invokeService() throws Exception {
Certificate certificate = (Certificate) domainObjects.get(Constants.CERTIFICATE);
CertActObjRel accOvrRel = (CertActObjRel) domainObjects.get(Constants.CERT_ACC_OBJ_REL);
if (certificate != null) {
dao.insert(certificate);
if (accOvrRel != null) {
dao.insert(accOvrRel);
}
CertObjRel certObjRel = (CertObjRel) domainObjects.get(Constants.CERT_OBJ_REL);
if (certObjRel != null) {
List<CertObjRel> certObjRelArray = certObjRel.getCertObjRelArray();
if (certObjRelArray != null && certObjRelArray.size() > 0) {
dao.insertList(certObjRelArray);
}
}
}
insertReqCertRelation();
insertDistributions();
fieldIssueUOW.fieldIssueCertificate(certificate);
}
方法invokeService()是一个abtsract方法,在子类中实现(使用Transactional注释。没有@transactional注释用于abtsract super calss方法invokeService()),并且从基础对象引用的Drool规则引擎调用。由于类bean不是spring bean,我们使用编译时编织。
事务管理器的Spring配置文件声明
<tx:annotation-driven transaction-manager="transactionManager" mode="aspectj"/>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
Spring-aspect.jar也粘贴在WEB-INF / lib文件夹中。使用
测试此方法 System.out.println("Transaction active:::: " + TransactionSynchronizationManager.isActualTransactionActive());
始终返回false。如果我们尝试在此方法中检索当前会话,则返回null。所以它确保交易没有运行。我们是否需要使用方法invokeservice()将类声明为@Aspect。 @ Aspect是编制时间编织的先决条件。即使在反编译.class文件并查看代码@Transactional仍然存在?。
答案 0 :(得分:0)
来自2.5的Spring文档
http://static.springsource.org/spring/docs/2.5.x/reference/transaction.html
默认模式“proxy”将处理要注释的带注释的bean 使用Spring的AOP框架(遵循代理语义,如上所述) 上面,仅适用于通过代理进入的方法调用)。该 替代模式“aspectj”将编织受影响的类 使用Spring的AspectJ事务方面(修改目标类) 字节码,以便应用于任何类型的方法调用)。 AspectJ的 编织需要类路径上的spring-aspects.jar以及 启用加载时编织(或编译时编织)。 (见章节 题为“如何配置”的第6.8.4.5节“弹簧配置” 设置加载时编织。)
您是否有装载时间编织设置?你有编译时编织设置吗?你是否用AspectJ事务注释装饰了类而不是Spring的?
删除mode =“aspectj”并查看它是否适合您。如果是,则调查您是否在运行时使用了合适的编织器。