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