我有一个服务(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);
}
}
感谢。
答案 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代理和延迟加载。这不是好事或坏事,取决于你想做什么。它可以通过配置进行相对定制。