我有一个带有@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调用一样?
答案 0 :(得分:2)
您可以使用来自Hibernate的Transaction,因为您说此方法不会在Spring托管环境中运行并以编程方式使用它。 从Hibernate SessionFactory创建Session对象。 从Session,您可以使用session.beginTransaction()获取Transaction。 查看 : Hibernate Docs
答案 1 :(得分:1)
当你从另一个bean调用它时,Spring只会添加它的事务逻辑。从同一个类调用方法时,将忽略该注释。
对于您而言,这意味着您应将aMethod()
移至另一个Bean并从现有ABean
调用它。