Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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
Java 如何在hibernate和Jackson中处理双向一对一关系_Java_Json_Hibernate_Jackson - Fatal编程技术网

Java 如何在hibernate和Jackson中处理双向一对一关系

Java 如何在hibernate和Jackson中处理双向一对一关系,java,json,hibernate,jackson,Java,Json,Hibernate,Jackson,我正在使用@JsonIgnore注释来防止在为响应创建Json时出现无限循环,它可以很好地满足我的需要,但是我想知道是否有一些替代方法,其中该属性实际上没有被忽略,但也阻止了无限循环 例如,我拥有具有以下属性的实体a: int id String name EntityB example; 而实体b已 int id String something EntityA entityAExample //(this one goes with the JsonIgnore) 所以,如果我得到ent

我正在使用
@JsonIgnore
注释来防止在为响应创建Json时出现无限循环,它可以很好地满足我的需要,但是我想知道是否有一些替代方法,其中该属性实际上没有被忽略,但也阻止了无限循环

例如,我拥有具有以下属性的实体a

int id
String name
EntityB example;
实体b

int id
String something
EntityA entityAExample //(this one goes with the JsonIgnore)
所以,如果我得到entityA中的所有寄存器,响应将如下所示:

[{
    "id":"1",
    "name": "name",
    "entityB": {
                 "id":"1",
                 "something": "text"
               }
}]
@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class EntityA{
    ...
}

@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class EntityB{
    ...
}
entityB看起来像:

[{
   "id":"1",
   "something": "text"
}]
[{
    "id":"1",
    "something": "text",
    "entityAExample": {
                      "id":"1",
                      "name": "name"
                      }
}]
到目前为止,它很适合我的需要,但我希望实体B也可以包括实体a(或者列表,如果是多对一关系),因此响应如下所示:

[{
   "id":"1",
   "something": "text"
}]
[{
    "id":"1",
    "something": "text",
    "entityAExample": {
                      "id":"1",
                      "name": "name"
                      }
}]

因此,无论我查询哪个实体,它都将始终显示相关记录。

这是处理json时常见的双向关系问题

我认为与Jackson一起解决这个问题的最简单方法是使用
@JsonIdentityInfo
。您只需要使用如下内容对类进行注释:

[{
    "id":"1",
    "name": "name",
    "entityB": {
                 "id":"1",
                 "something": "text"
               }
}]
@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class EntityA{
    ...
}

@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class EntityB{
    ...
}
这样做的目的是,当之前已经序列化的实体(即父实体(EntityA))必须在启动无限递归循环的第二次序列化时,它将不会像往常一样被序列化

相反,它将使用您在注释中指定的属性(即
id
)进行序列化

简而言之,注释允许您指定对象的替代表示形式,该表示形式仅在实体启动无限循环时使用,从而中断该循环

以下示例将导致:

[{
    "id":"1",
    "name": "name",
    "entityB": {
                 "id":"2",
                 "something": "text"
                 "entityAExample": "1"                                       
               }
}]
[{
    "id":"1",
    "name": "name",
    "entityB": {
                 "id":"2",
                 "something": "text"
                 "entityAExample": {
                                    "id": "1",
                                    "name": "name",
                                    "entityBExample": "2"                                         
                                   }
               }
}]
您还可以只注释EntityB而不是两个实体,这将导致:

[{
    "id":"1",
    "name": "name",
    "entityB": {
                 "id":"2",
                 "something": "text"
                 "entityAExample": "1"                                       
               }
}]
[{
    "id":"1",
    "name": "name",
    "entityB": {
                 "id":"2",
                 "something": "text"
                 "entityAExample": {
                                    "id": "1",
                                    "name": "name",
                                    "entityBExample": "2"                                         
                                   }
               }
}]
您也可以使用其他属性,尽管“id”通常可以正常工作。官方文件和


一篇文章更详细地解释了这一点,还有一篇文章展示了解决它的其他方法。

我试图使用所解释的解决方案,但在生成json:java.lang.OutOfMemoryError:java heap space时,我遇到了一个java heap space错误