java - 如何解决 hibernate 双向映射导致的json序列化器中的循环引用?

标签 java hibernate json serialization

我正在编写一个序列化程序来将 POJO 序列化为 JSON,但遇到了循环引用问题。在 hibernate 双向一对多关系中,父引用子和子引用返回父,这里我的序列化器死了。 (参见下面的示例代码)
如何打破这个循环?我们能否获取对象的所有者树以查看对象本身是否存在于其自己的所有者层次结构中的某个位置?还有其他方法可以确定引用是否是循环的?或任何其他想法来解决这个问题?

最佳答案

我依赖 Google JSON使用该功能来处理此类问题

Excluding Fields From Serialization and Deserialization

假设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

关于java - 如何解决 hibernate 双向映射导致的json序列化器中的循环引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3340485/

相关文章:

java - Hibernate 被弃用了吗?

java - 使用 Hibernate 获取 BLOB LAZY 的最佳方法

java - Hibernate 未设置引用列

javascript - javascript 如何解析带引号的 JSON 字符串

MySQL 附加到年份值

javascript - 从 Javascript 数组读取数据返回 'undefined'

java - 具有该名称 [<name>] 的 hibernate 参数不存在

java - RSS 阅读器 openStream()

java - 员工排类实体关系

java - 如何在 Java 中设置背景图像?