2009-05-05 77 views
2

我正在使用Spring并使用TransactionInterceptor透明地获取Hibernate事务的程序。这使得非常方便的说“当这个方法从其他类中调用时,如果它不在一个事务中,则将它包装在事务中。”获取Spring类中的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为我调用本地方法并在需要时将其包装在事务中,还是必须在另一个类中连接到此类?

回答

1

定义类实现的接口,其中transactionalMethod();使用依赖注入来将类的值设置为它自己的实现;在你的bean工厂中,允许Spring在该接口实现中插入一个Around方面。这应该适合您的需求。

0

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

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

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

相关问题