Spring 弹簧&x2B;Hibernate如何使用AspectJ控制事务

Spring 弹簧&x2B;Hibernate如何使用AspectJ控制事务,spring,hibernate,transactions,Spring,Hibernate,Transactions,在代理模式(这是默认模式)下,只截获通过代理传入的外部方法调用。这意味着自调用,实际上是目标对象内调用目标对象另一个方法的方法,即使调用的方法标记为@Transactional,在运行时也不会导致实际事务。 所以我想使用AspectJ,但我无法通过sessionFactory.getCurrentSession()获取会话,这导致了以下异常。 hibernate.HibernateException:没有绑定到线程的hibernate会话,并且配置不允许在此创建非事务会话 我在运行时添加了VM参

在代理模式(这是默认模式)下,只截获通过代理传入的外部方法调用。这意味着自调用,实际上是目标对象内调用目标对象另一个方法的方法,即使调用的方法标记为@Transactional,在运行时也不会导致实际事务。 所以我想使用AspectJ,但我无法通过
sessionFactory.getCurrentSession()
获取会话,这导致了以下异常。 hibernate.HibernateException:没有绑定到线程的hibernate会话,并且配置不允许在此创建非事务会话

我在运行时添加了VM参数。 -javaagent:/Users/xx/workStation/workspace/SpringHibernate/src/lib/spring-instrument-3.2.8.RELEASE.jar

这是配置文件 aop.xml

如果我不使用JUnit,它工作得很好

public class TxTestMain {

public static void main(String[] args) {
    ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
    TxTest txTestA = (TxTest)ac.getBean("txTestA");
    txTestA.txA();
}
}

怎么会呢

在代理模式(默认)下,只有外部方法调用 通过代理进入被拦截。这意味着 自调用,实际上是目标对象中调用 目标对象的另一种方法,不会导致实际的 即使调用的方法标记为 @事务性的


我不知道这是否是一个问题,但是bean可以通过代理调用它自己的方法。只需在您的bean接口(如ApplicationContextAware和BeanNameWare)中实现,有了这两个接口,您就可以询问有关bean的上下文,并通过代理(在事务中)调用任何方法。当然,这只有在范围是单例的情况下才有效,如果它是原型,那么也有一些方法可以通过API实现。

尝试删除
aop.xml
,并确保类路径中有
spring aspects.jar
。另外,请确保在ContextLoaderListener(s)应用程序上下文中启用loadtimeweaving,否则可能会遇到类已加载且不再编织的情况。
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref = "dataSource"/>
     <property name="mappingResources">
        <list>
            <value>config/User.hbm.xml</value>
        </list>
     </property>
    <property name="hibernateProperties">
        <value>
            hibernate.dialect=org.hibernate.dialect.MySQLDialect
            hibernate.hbm2ddl.auto=update
            hibernate.show_sql=true
            hibernate.format_sql=false
        </value>
    </property>
</bean>

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref = "sessionFactory"/>
    <property name="nestedTransactionAllowed" value = "true"/>
</bean>
<tx:annotation-driven mode="aspectj" transaction-manager="txManager" />
<context:load-time-weaver />
static UserService userService;
static TxTest txTest;
static TxTestX txTestx;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
    ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
    userService = (UserService)ac.getBean("UserService");
    txTest = (TxTest)ac.getBean("txTestA");
    txTestx = (TxTestX)ac.getBean("txTestX");
}
public class TxTestMain {

public static void main(String[] args) {
    ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
    TxTest txTestA = (TxTest)ac.getBean("txTestA");
    txTestA.txA();
}