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