如何解决Hibernate双向映射导致的JSON序列化中的循环引用问题?

20 浏览
0 Comments

如何解决Hibernate双向映射导致的JSON序列化中的循环引用问题?

我正在编写一个序列化器将 POJO 序列化为 JSON,但是卡在了循环引用的问题上。在 Hibernate 双向一对多关系中,父级引用子级,子级又引用回父级,我的序列化器就会挂掉。(请参见下面的示例代码)

如何打破这种循环?我们可以获取对象的所有者树,以查看对象本身是否存在于其自身的所有者层次结构中吗?还有其他方法可以确定参考是否将成为循环吗?还有其他解决此问题的想法吗?

admin 更改状态以发布 2023年5月24日
0
0 Comments

Jackson 1.6(2010年9月发布)具有特定的注释支持,用于处理此类父/子链接,请参见http://wiki.fasterxml.com/JacksonFeatureBiDirReferences。(Wayback Snapshot

当然,您可以通过大多数JSON处理包(jackson,gson和flex-json)已经支持的方法来排除父链接的序列化,但是真正的技巧在于如何将其反序列化回来(重新创建父链接),而不仅仅是处理序列化方面。 虽然现在听起来仅仅排除可能对您有效。

编辑(2012年4月):Jackson 2.0现在支持真正的标识引用Wayback Snapshot),因此您也可以通过这种方式解决它。

0
0 Comments

我使用Google JSON来处理这种问题,使用该特性

从序列化和反序列化中排除字段

假设A类和B类之间存在双向关系,如下所示

public class A implements Serializable {
    private B b;
}

以及B

public class B implements Serializable {
    private A a;
}

现在使用GsonBuilder获取自定义的Gson对象,如下所示(注意setExclusionStrategies方法)

Gson gson = new GsonBuilder()
    .setExclusionStrategies(new ExclusionStrategy() {
        public boolean shouldSkipClass(Class clazz) {
            return (clazz == B.class);
        }
        /**
          * Custom field exclusion goes here
          */
        public boolean shouldSkipField(FieldAttributes f) {
            return false;
        }
     })
    /**
      * Use serializeNulls method if you want To serialize null values 
      * By default, Gson does not serialize null values
      */
    .serializeNulls()
    .create();

现在我们的循环引用

A a = new A();
B b = new B();
a.setB(b);
b.setA(a);
String json = gson.toJson(a);
System.out.println(json);

看看GsonBuilder

0