繁体   English   中英

Spring @Transactional注释的严格替代品

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM