[英]Strict alternative to Spring @Transactional annotation
我有一个带有@Transactional方法的Spring bean。
public class ABean{
@Transactional
public void method aMethod(){
//do some job with Hibernate.
}
}
但是现在我需要从另一个应该在Spring上下文中调用的方法调用此方法(实际上在Quartz上下文中):
public class ABean implements org.quartz.Job{
@Transactional
public void method aMethod(){
//do some job with Hibernate.
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("start...");
//@Transactional annotation is ignored here
//so I have 'Could not obtain transaction-synchronized Session
//for current thread' exception.
aMethod();
System.out.println("done");
}
}
据我所知,注释@Transactional只是以某种方式用另一个代码包装方法。 那么我怎么必须包装aMethod()调用来调用它就像Spring调用一样?
您可以使用来自Hibernate的Transaction,因为您说此方法不会在Spring托管环境中运行并以编程方式使用它。 从Hibernate SessionFactory创建Session对象。 从Session,您可以使用session.beginTransaction()获取Transaction。 退房: Hibernate Docs
当您从另一个bean调用它时,Spring只会添加其事务逻辑。 从同一个类调用方法时,将忽略该注释。
对于你来说,这意味着你应该将aMethod()
移动到另一个Bean并从现有的ABean
调用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.