grails中withTransaction和withSession有什么区别?

时间:2013-10-30 19:09:01

标签: hibernate session grails transactions gorm

我知道有人获得基础会话而另一方获得对当前交易状态的引用;但是,它们之间的区别是什么?每个用例的用例是什么?

我的要求是在Service方法块中批量保存一些记录。

2 个答案:

答案 0 :(得分:22)

withTransaction有点hackish,因为它允许您在任何地方进行交易工作,但最好将您的顾虑分开并在交易服务中完成工作。默认情况下,服务是事务性的,除非您添加static transactional = false并且可以使用@Transactional注释在类和/或方法级别进行微调。您可以将代码放在服务方法中而不使用withTransactionwithSession

withSession是访问当前Hibernate Session(通常是OpenSessionInView拦截器注册的Hibernate)的便捷方式。如果你想清除会话,或做其他未被GORM公开的工作,这是一种访问它的方法,无需访问sessionFactory或Spring使用的线程本地持有者。

在事务服务方法之外对withTransaction进行一些有效的使用是在您不在控制器请求之外时绑定Hibernate Session(即没有自动创建的Session })。如果需要,withTransaction将启动一个事务并创建一个Session,并在关闭期间保持打开状态。因此,您可以使用它来避免延迟加载异常。在没有事务开销的情况下,我们需要另一种方法来执行此操作,对于那些只是从数据库中读取而不需要事务性写入的情况。但就目前而言,这种方法很有效。但是,如果进行数据库写入,请将代码移动到服务方法。

答案 1 :(得分:3)

SessionTransactionStatus 是完全不同的两件事。 Session是一个抽象,可以让您访问所有的休眠功能,而TransactionStatus可以用来控制当前的事务。

如果您需要直接访问hibernate函数,可以使用

withSession。如果您想使用Grails / GORM不直接支持的休眠功能,这将非常有用。