我知道一个获取基础会话,另一个获取对当前事务状态的引用;但是,它们之间有什么区别以及每个示例用例是什么?
我的要求是在服务方法块中批量保存一些记录。
我知道一个获取基础会话,另一个获取对当前事务状态的引用;但是,它们之间有什么区别以及每个示例用例是什么?
我的要求是在服务方法块中批量保存一些记录。
withTransaction
有点骇人听闻,因为它允许您在任何地方进行事务性工作,但最好将您的关注点分开并在事务性服务中完成工作。除非您添加服务,否则默认情况下服务是事务性的,并且可以使用注释static transactional = false
在类和/或方法级别进行微调。@Transactional
只需将代码放入服务方法中而不使用withTransaction
or就可以了withSession
。
withSession
是访问当前 Hibernate 的一种便捷方式Session
(通常是由 OpenSessionInView 拦截器注册的)。如果您想清除会话,或执行 GORM 未公开的其他工作,这是一种无需访问sessionFactory
Spring 使用的线程本地持有者即可访问它的方法。
withTransaction
事务服务方法之外的一种比较有效的用法是Session
当您在控制器请求之外时(即没有自动创建的Session
)绑定 Hibernate。withTransaction
将启动一个事务并Session
在需要时创建一个事务,并在关闭期间保持打开状态。因此,您可以使用它来避免延迟加载异常。我们需要另一种方法来做到这一点,而不需要事务的开销,对于那些你只是从数据库中读取而不需要事务性写入的情况。但就目前而言,这种方法有效。但是,如果您执行数据库写入,请将代码移动到服务方法。
Session和TransactionStatus是两个完全不同的东西。Session 是一种抽象,可让您访问所有休眠功能,而 TransactionStatus 可用于控制当前事务。
withSession
如果您需要直接访问休眠功能,可以使用。如果您想使用 Grails/GORM 不直接支持的休眠功能,这会很有用。