【问题标题】:Removing proxy part of grails domain object?删除 grails 域对象的代理部分?
【发布时间】:2011-08-03 02:37:41
【问题描述】:

我想获得一个域对象的实际实例。也就是说,我需要序列化对象,并且我试图在httpinvoker 链的两侧使用域对象。有没有办法获得一个没有任何 grails 连接的完全加载的域对象,以便我可以序列化它?

【问题讨论】:

标签: hibernate grails groovy proxy grails-orm


【解决方案1】:

我们做GrailsHibernateUtil.unwrapIfProxy(obj)。它不会摆脱 Grails 注入的方法等 - 只有 Hibernate/GORM 代理,但应该足够了。

编辑

  1. 抱歉,您是否将域类声明为implements Serializable
  2. 这可能是您在课程中添加/注入的内容,例如在 Grails non-bug 6379 中。
  3. 这段代码(知道了here)在grails console 的一个小型域类上为我工作:

.

import org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsHibernateUtil
import com.somegroup.domain.*

def loc = SomeDomainClass.get(1)
loc = GrailsHibernateUtil.unwrapIfProxy(loc)

ByteArrayOutputStream bos = new ByteArrayOutputStream()
ObjectOutput out = new ObjectOutputStream(bos)

out.writeObject(loc)
byte[] yourBytes = bos.toByteArray()

【讨论】:

  • 这会让你序列化和反序列化对象作为域类的一个实例,没有 grails?这是我真正需要的,以前尝试简单地打开代理的尝试都失败了。我随便用谷歌搜索了 unwrapIfProxy 的来源。
  • 这一定是你班上的东西。我尝试序列化一个简单的域类,它成功了。
  • 这里是源代码:https://github.com/grails/grails-core/blob/master/grails-hibernate/src/main/groovy/org/codehaus/groovy/grails/orm/hibernate/cfg/GrailsHibernateUtil.java
  • 好像我现在明白了:ClassNotFoundException: org.hibernate.collection.PersistentSet。我将尝试在反序列化端包含休眠 jar,看看会发生什么。
  • 看起来 Hibernate 将对象获取限制为单个查询,因此一次只加载一个子集合 (forum.hibernate.org/…)。所以你需要某种递归初始化。深拷贝,正如这里的一个答案 (stackoverflow.com/questions/182323/…) 所建议的那样,可以做到这一点。
【解决方案2】:

根据答案here 中的第二条评论,使用GrailsHibernateUtil.unwrapIfProxy 显式解包代理类需要另一个数据库调用。我一直在使用HibernateProxyHelper.getClassWithoutInitializingProxy 来获得相同的结果,而且我很确定这不会进行任何额外的数据库调用。

【讨论】:

  • 好点!不过,我有疑问:它会总是导致查询,还是仅当存在未初始化的字段时?如果是后者,那么大多数时候使用unwrapIfProxy 可能更安全。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多