Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 删除grails域对象的代理部分?_Hibernate_Grails_Groovy_Proxy_Gorm - Fatal编程技术网

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

Hibernate 删除grails域对象的代理部分?,hibernate,grails,groovy,proxy,gorm,Hibernate,Grails,Groovy,Proxy,Gorm,我想获得一个域对象的实际实例。也就是说,我需要序列化对象,并且我正在尝试在httpinvoker链的两侧使用域对象。有没有一种方法可以获得一个没有任何grails连接的完全加载的域对象,这样我就可以序列化它?我们可以GrailsHibernateUtil.UnwapifProxy(obj)。它不会摆脱Grails注入的方法和类似的方法——仅限于Hibernate/GORM代理,但它应该足够了 编辑: 很抱歉询问,但是您是否将域类声明为实现可序列化 它可能是您在类中添加/注入的内容,如 这段代码(

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

我们可以
GrailsHibernateUtil.UnwapifProxy(obj)
。它不会摆脱Grails注入的方法和类似的方法——仅限于Hibernate/GORM代理,但它应该足够了

编辑

  • 很抱歉询问,但是您是否将域类声明为
    实现可序列化
  • 它可能是您在类中添加/注入的内容,如
  • 这段代码(已获得)在
    grails console
    的一个小域类中为我工作:

  • 根据答案中的第二条注释,使用
    grailshbernateutil.unwrapIfProxy
    显式展开代理类需要另一个数据库调用。我一直在使用来实现相同的结果,我非常确定这不会进行任何额外的数据库调用。

    这可能会重复,您是否可以将对象序列化和反序列化为域类sans 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
    。我将尝试在反序列化端包含hibernate jar,看看会发生什么。因此,您需要某种递归初始化。正如这里的一个答案()所暗示的那样,深度复制可以做到这一点!尽管如此,我还是有疑问:它是否总是会导致查询,或者仅当存在未初始化的字段时才会产生查询?如果是后者,那么在大多数情况下使用
    unwapifproxy
    可能更安全。
    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()