Spring @Transactional注释的严格替代品

时间:2016-11-23 11:31:02

标签: java spring

我有一个带有@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调用一样?

2 个答案:

答案 0 :(得分:2)

您可以使用来自Hibernate的Transaction,因为您说此方法不会在Spring托管环境中运行并以编程方式使用它。 从Hibernate SessionFactory创建Session对象。 从Session,您可以使用session.beginTransaction()获取Transaction。 查看 : Hibernate Docs

答案 1 :(得分:1)

当你从另一个bean调用它时,Spring只会添加它的事务逻辑。从同一个类调用方法时,将忽略该注释。

对于您而言,这意味着您应将aMethod()移至另一个Bean并从现有ABean调用它。