删除grails域对象的代理部分?

时间:2011-04-11 14:07:28

标签: hibernate grails groovy proxy gorm

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

2 个答案:

答案 0 :(得分:8)

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

修改

  1. 很抱歉,但您是否将域名声明为implements Serializable
  2. 可能是您在课堂上添加/注入的内容,例如Grails non-bug 6379
  3. 这段代码(得到它here)在grails console的小域名类中为我工作:
  4. 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()
    

答案 1 :(得分:1)

根据答案here中的第二条评论,明确地使用GrailsHibernateUtil.unwrapIfProxy展开代理类需要另一个数据库调用。我一直在使用HibernateProxyHelper.getClassWithoutInitializingProxy来实现相同的结果,我很确定这不会进行任何额外的数据库调用。