Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/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 Spring JPA具有相同实体的多个关系_Java_Spring_Jpa_Spring Boot_Spring Data - Fatal编程技术网

Java Spring JPA具有相同实体的多个关系

Java Spring JPA具有相同实体的多个关系,java,spring,jpa,spring-boot,spring-data,Java,Spring,Jpa,Spring Boot,Spring Data,我有以下关系: 我试图在SpringBoot中使用JPA映射这些关系,但遇到了一些麻烦。这些是课程: 人: public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; // Relations @OneToOne @JoinColumn(name = "child

我有以下关系:

我试图在SpringBoot中使用JPA映射这些关系,但遇到了一些麻烦。这些是课程:

人:

public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    // Relations

    @OneToOne
    @JoinColumn(name = "child_id")
    private PersonBirth birth;

    @OneToMany
    @JoinColumn(name = "mother_id")
    private List<PersonBirth> motherOf;

    @OneToMany
    @JoinColumn(name = "father_id")
    private List<PersonBirth> fatherOf;
}
public class Birth {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "birth_date")
    @JsonProperty(value = "birth_date")
    private Long birthDate;

    // Relations

    @OneToOne
    @JoinColumn(name = "child_id")
    private Person child;

    @ManyToOne
    @JoinColumn(name = "mother_id")
    private Person mother;

    @ManyToOne
    @JoinColumn(name = "father_id")
    private Person father;
}

我正试图获得一个
皮尔逊
和他的
出生
数据,包括他的
母亲
父亲
。而且还可以通过
fatherOf
motherOf
映射一个
人及其子代。但现在的情况是,当我获取一个
的母亲时,它抛出堆栈溢出,因为它获取
出生
数据,其中包含
孩子
数据(到目前为止我想要的),其中包含他的
出生
数据,其中包含他的母亲,其中包含她的孩子(等等)。我不知道我想用这个结构做什么是可能的,或者我是否必须改变它。。。非常感谢您的建议。

根据您的描述,我猜将结构序列化为JSON时会出现问题。如果使用Jackson(这是Spring Boot的默认设置),则可以使用
@JsonManagedReference
@JsonBackReference
注释:

public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    // Relations

    @OneToOne
    @JoinColumn(name = "child_id")
    @JsonManagedReference("birth")
    private PersonBirth birth;

    @OneToMany
    @JoinColumn(name = "mother_id")
    @JsonManagedReference("mother")
    private List<PersonBirth> motherOf;

    @OneToMany
    @JoinColumn(name = "father_id")
    @JsonManagedReference("father")
    private List<PersonBirth> fatherOf;
}

public class Birth {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "birth_date")
    @JsonProperty(value = "birth_date")
    private Long birthDate;

    // Relations

    @OneToOne
    @JoinColumn(name = "child_id")
    @JsonBackReference("birth")
    private Person child;

    @ManyToOne
    @JoinColumn(name = "mother_id")
    @JsonBackReference("mother")
    private Person mother;

    @ManyToOne
    @JoinColumn(name = "father_id")
    @JsonBackReference("father")
    private Person father;
}
公共类人物{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
私有字符串名称;
//关系
@奥内托内
@JoinColumn(name=“child\u id”)
@JsonManagedReference(“出生”)
个人出生;
@独身癖
@JoinColumn(name=“mother\u id”)
@JsonManagedReference(“母亲”)
母亲私人名单;
@独身癖
@JoinColumn(name=“father\u id”)
@JsonManagedReference(“父亲”)
私人名单;
}
公共阶层出生{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@列(name=“出生日期”)
@JsonProperty(value=“出生日期”)
私人长生日;
//关系
@奥内托内
@JoinColumn(name=“child\u id”)
@JsonBackReference(“出生”)
私人儿童;
@许多酮
@JoinColumn(name=“mother\u id”)
@JsonBackReference(“母亲”)
私人母亲;
@许多酮
@JoinColumn(name=“father\u id”)
@JsonBackReference(“父亲”)
私人父亲;
}
这样,Jackson就不会为back引用序列化整个对象,而只序列化标识符


文档:

只需添加@dunni回答的内容:

为了让Jackson能够很好地工作,不应该序列化关系的两侧之一,以避免导致stackoverflow错误的讨厌的无限递归循环

Jackson获取引用的前向部分,例如java类的属性(即用户类中的列表角色),并将其转换为类似json的存储格式;这就是所谓的编组过程。 然后,Jackson查找引用的后面部分(即Role类中的列表用户),并保持原样,而不是序列化它。这部分关系将在前向引用的反序列化(解组)过程中重新构造

参考:
@JsonIgnore
与JPA没有任何关系。因此,请详细说明您的问题。“一般来说,这种关系对JPA没有问题。”邓尼编辑了这个问题,看看是否更清楚。谢谢。你应该把你原来问的问题颠倒过来,这与Jackson library有关,你需要在一个上注释
@JsonManagedReference
,在多个引用上注释
@JsonBackReference
。是的,这样我就摆脱了循环,但我无法获得我想要的数据。比如,如果我用他的
出生数据得到
,我就看不到
母亲
父亲
数据,只有
出生的
id
出生日期
,所以,考虑到这一点以及我创建的结构,我将无法获得一个
Person
及其子数据(不使用单独的查询操作并填充字段,比如一个查询获取Person数据,另一个查询获取其子数据)?