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错误