单例类的Spring事务 - 问题

时间:2014-01-14 04:58:38

标签: spring hibernate spring-transactions transactional

我有一个服务(Hibernate DAO),它从数据库中检索数据并将其返回给客户端。其中一个开发人员已经在类本身上插入了@Transactional而没有设置任何属性。 spring的appliciation上下文中的bean声明指定此服务是单例。

现在的问题是,当调用此服务中的多个方法时,spring是否仍会在多个方法调用中保持会话活动?这给我带来了什么问题?这是一个好习惯吗?下面的代码段。

@Transactional
public class SomeService implements IService{

public TestObjects returnTestObj(){
  return   testDao.findById(11);
}

public TestObjects returnAnotherTestObj(){
   //some processing in the session.
  return testDao.findById(11);
}

}

感谢。

2 个答案:

答案 0 :(得分:1)

长话短说明@Transactional注释将导致Spring在方法调用之前检查事务是否已打开 - 并根据设置打开new / use existing - 因此您的代码是免费的以编程方式打开和进行交易。

通常,事务将在方法体的末尾关闭(编译),但是如果调用方法也被注释,那么事务可能会继续。

这部分面向Spring方面的编程功能。如果你想了解更多信息,你必须花时间在手册上阅读。

答案 1 :(得分:1)

由于@Transactional(和<tx:annotation-driven>或相应的Java配置),Spring将代理您的SomeService bean。该代理将拥有交易行为,即。打开Session,开始Transaction,提交或回滚Transaction,然后关闭Session

  

当调用此服务中的多个方法时,是吗?   spring仍然会在多个方法调用中保持会话活动

在方法返回之前,Session将保持打开状态。例如

SomeService service = ...// get bean
service.returnTestObj(); // session boundary
service.returnAnotherTestObj(); // other session boundary
  

这给我带来了什么问题?这是一个好习惯吗?

你必须小心Hibernate代理和延迟加载。这不是好事或坏事,取决于你想做什么。它可以通过配置进行相对定制。