2014-06-23 25 views
0

我有一个关于Grails中的Merge()方法的问题,我阅读了文档,并且我明白这个方法返回一个持久对象,但是我没有找到任何解释原始主题(已分离)已成为什么。合并后原始对象会变成什么

我想举一个例子:

request_1 : usr=User.get(id); Hibernate.initialize(usr.rules) ; session.currentUser = usr 
request_2 : session.currentUser.merge() // i've ignored the returned attached object 
request_3 : log.info session.currentUser.rules.collect{it.authority} // Lazy loading exception 

就像所示的代码,我强迫“USR”实例“规则”收集initialiazation,然后我把它保存在HttpSession中。 在第二个请求中,“session.usr”变成分离的,我对它做了merge(),并且我忽略了返回的附加对象,因为我会检查httpsession中原始分离对象的状态。 在第三个请求中,我尝试访问“规则”集合,并得到“延迟加载异常”,但在第一个请求中,“规则”集合已被加载...

回答

1

返回的对象merge()与您在会话中使用的实例不同,而是将新实例与保存在HTTP会话中的分离对象的状态组合在一起。您需要确保在合并后初始化关联。坦率地说,执行一个渴望的查找器并执行手动合并会更有效率。

+0

谢谢rocher,但我仍然不明白为什么强制加载的集合在merge()之后不再存在于内存中?通过使用Hibernate.initialize(usr.rules)加载“规则”集合,然后将“usr”实例存储在httpsession中。在下一个请求中,“session.usr”变得分离,如果我将它合并回hibernate会话中,然后尝试访问原始分离对象“session.usr”的“规则”集合,我会收到一个“延迟加载异常“,但我之前已经初始化了这个集合。 – Greedydp

相关问题