代码之家  ›  专栏  ›  技术社区  ›  Brandon Yarbrough

在Spring类中获取休眠事务

  •  2
  • Brandon Yarbrough  · 技术社区  · 16 年前

    我正在开发一个使用Spring的程序,它使用TransactionInterceptor透明地获取休眠事务。这使得说“当从其他类调用这个方法时,如果它不在一个类中,就将它包装在一个事务中”非常方便。

    但是,我有一个类需要尝试写入,必须立即查明它是否成功。尽管我想要两个方法,但我希望有一种方法可以让它们保持在同一个类中,而不需要显式地创建一个事务过程。实际上,我想要这样的东西:

    public void methodOne() {
        //..do some stuff
        try  {
           transactionalMethod();//won't do what I want
        } catch(OptimisticLockingFailure e) {
          //..recover
        }
    }
    
    @Transactional
    public void transactionalMethod() {
        //...do some stuff to database
    }
    

    不幸的是,据我所知,这行不通,因为我直接打电话给TransactionalMethod。有没有一种方法可以让Spring为我调用一个本地方法,并在需要时将其包装在事务中,或者它必须位于我连接到这个方法的另一个类中?

    2 回复  |  直到 16 年前
        1
  •  1
  •   Paul Sonier    16 年前

    定义类实现的接口,该接口执行 transactionalMethod() ;使用依赖注入将类的值设置为它自己的实现;在Bean工厂中,允许Spring围绕该接口实现插入一个环绕方面。这应该能满足你的需要。

        2
  •  0
  •   mR_fr0g    16 年前

    如果你想要 transactionalMethod 要成为它自己事务的一部分,而不是简单地加入到已经处于活动状态的事务中,您必须将传播设置为需要新的。就像这样

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void transactionalMethod() {
        //...do some stuff to database
    }
    

    您还应该检查事务管理器是否支持这种传播。这意味着TransactionalMethos与从中调用它的另一个事务完全分离,它也将完全独立地提交/回滚。