在服务方法回滚后从数据库中读取对象

时间:2010-07-20 15:35:06

标签: hibernate grails

我有一个持续更改的grails服务。如果我回滚服务类中的事务,抛出RuntimeException,然后(在同一个请求中)我尝试重新读取任何数据,我得到以下异常:

ERROR hibernate.LazyInitializationException  - failed to lazily initialize a collection of role: <my related class> no session or session was closed

所以,案例如下:

我尝试更新服务类中的对象,如果失败,我将回滚事务。 在控制器中,处理异常,然后返回失败对象的XML。创建XML grails是尝试读取所有相关对象-lazy load 1-n relationship-(这就是我想要的),但是因为我们已经在服务类中进行了回滚,所以我没有会话,并且它失败了。 我尝试使用.withNewSession {}但它不起作用。

任何想法或解决方法?

2 个答案:

答案 0 :(得分:1)

似乎你有Detached Object所以尝试使用merge()方法。

答案 1 :(得分:1)

首先,你是手动处理交易(听起来像是你的帖子)吗?如果您使服务事务处理,Grails将为您执行此操作。我建议不要试图自己管理tx,如果这确实是你正在做的事情。像这样的东西很复杂且容易出错,如果Grails为你做这件事,你为什么要这样做呢?

其次,听起来好像是出错,您正在尝试访问已加载的数据。由于你的会话在tx回滚时消失了,你不能这样做。如果可能的话,我会将您的错误消息更改为不依赖会话中的任何数据。即不要尝试xml-ify对象。

虽然,我不确定为什么withNewSession不起作用......我们能看到一些代码吗?