【问题标题】:Obtaining a Hibernate transaction within a Spring class在 Spring 类中获取 Hibernate 事务
【发布时间】:2009-05-05 19:06:21
【问题描述】:

我正在开发一个使用 Spring 并使用 TransactionInterceptor 透明地获取 Hibernate 事务的程序。这样可以很方便地说“当从其他类调用此方法时,如果它还没有在一个事务中,则将其包装在一个事务中。”

但是,我有一个类需要尝试写入,并且必须立即找出它是否成功。虽然我无论如何都想要两种方法,但我希望有一种方法可以将它们保持在同一个类中,而无需在程序上显式创建事务。实际上,我想要这样的东西:

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 为我调用本地方法并在需要时将其包装在事务中,还是必须在我连接到这个的另一个类中?

【问题讨论】:

    标签: java database hibernate spring


    【解决方案1】:

    定义一个类实现的接口,该接口执行transactionalMethod();使用依赖注入将类的值设置为它自己的实现;在您的 bean 工厂中,允许 Spring 在该接口实现周围插入一个 Around 方面。这应该可以满足您的需求。

    【讨论】:

      【解决方案2】:

      如果您希望transactionalMethod 成为它自己的事务的一部分,而不是简单地加入已经处于活动状态的事务,您必须将传播设置为 REQUIRES_NEW。像这样

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

      您还应该检查您的事务管理器是否支持这种传播。这意味着 transactionalMethos 与调用它的其他事务完全分开,它也将完全分开提交/回滚。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-26
        • 1970-01-01
        • 2011-06-13
        • 2011-11-01
        • 2012-10-16
        • 1970-01-01
        • 2011-08-22
        • 1970-01-01
        相关资源
        最近更新 更多