@Transactional无法正常工作

时间:2011-12-30 07:18:25

标签: hibernate spring aspectj

试图在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仍然存在?。

1 个答案:

答案 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”并查看它是否适合您。如果是,则调查您是否在运行时使用了合适的编织器。