尝试双向映射时 Java 中的对象递归

Object Recursion in Java while trying for bi-directional mapping

我有两个 类,它们具有双向关系,并且由于其设置方式而存在递归对象结构问题。

Employer employer = new Employer(); 
employer.setName("sample1");

Employee empl = new Employee();

List<Employer> listOfEmployers = new ArrayList<Employer>();
listOfEmployers.add(employer); //i am assuming this part of code is causing recursion issue

 empl.setEmployers(listOfEmployers);
 employer.setEmployee(empl); //will have recursive object structure

将 java 对象转换为 JSON 时会导致问题(org.codehaus.jackson.map.JsonMappingException:无限递归).因此,jackson 无法将 java 对象处理成 JSON。

但是,您能帮我了解一下 Java 幕后到底发生了什么来解决根本原因吗?

在 java 层中没有出现递归问题的情况下,在 Employer 和 Employee 之间形成这种映射的正确对象模型是什么?

如果您有两个对象,ab,这两个对象都有一个指向另一个的 v 成员:

A a = new A();
B b = new B();
a.name = "a";
a.v = b;
b.name = "b"
b.v = a;

那么,您打算如何将其表示为 JSON?或者作为任何其他串行数据格式?:

{
   "name": "a",
   "v": {
       "name": "b",
       "v": {
          "name": "a",
          "v": {
             "name": "b",
             "v": {
                "name": "a",
                "v": {
                   "name": "b",
                   "v": {
                      "name": "a",
                      "v": {
                         "name": "b",
                         "v": {

...永远

JSON 没有处理这个问题的标准方法。您可以通过显式键间接引用来解决它:

{
    "key1": {
          "name": "a",
          "v_key" : "key2"
    },
    "key2": {
          "name": "b",
          "v_key": "key1"
    }
}

在 Java 中,这可以通过以下方式实现:

Map<String,Object> map = new HashMap<String,Object>();
A a = new A();
a.name = "a";
map.add("a", a);

B b = new B();
b.name = "b";
map.add("b", b);

a.v_key = "b";
b.v_key = "a";

您还没有告诉我们您正在使用什么 JSON 库。它可能具有使用与上述类似的方法自动处理循环依赖性的方法。在其文档中搜索单词 "cyclic"。

(对于杰克逊,请参阅:Infinite Recursion with Jackson JSON and Hibernate JPA issue