使用自引用创建jpa实体

7z5jn7bk  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(306)

我有一个pojo需要一对一Map的自引用。我用飞道把table抬上来。应用程序启动正常,但是当我尝试执行get请求时,出现以下错误:

nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Direct self-reference leading to cycle

我觉得我自我参照的方式有问题。请帮忙。提前谢谢。
以下是我的sql:

CREATE TABLE tbl_person (
    id BIGINT(20) NOT NULL AUTO_INCREMENT,
    name VARCHAR(255),
    parent_id BIGINT(20),
    primary key (id));

CREATE SEQUENCE person_seq START WITH 1 INCREMENT BY 1;

这是我的模型:

@Entity
@Data
@Table(name="tbl_person")
public class Person {

    @Id
    @GeneratedValue(strategy= GenerationType.SEQUENCE,generator = "person_seq")
    @SequenceGenerator(name="person_seq",allocationSize = 1)
    @Column(name="id",insertable =false,nullable = false,updatable = false)
    private Long id;

    @Column(name="name")
    private String name;

    @Column(name="address")
    private String address

    @OneToOne
    @JoinColumn(name="parent_id")
    @JsonManagedReference
    private Person person;

}
x9ybnkn6

x9ybnkn61#

错误信息来自Jackson。因此,它在转换为java对象或返回json/xml时失败,而不是在将其写入数据库时失败。
问题是,生成的json对象可能包含另一个人json,后者可能引用同一个人。这将创建一个无限循环。
在这种情况下会产生这样的结果:

{
    "id": 1,
    "name": "Example",
    "address": "example-address",
    "person": {
        "id": 1,
        "name": "Example",
        "address": "example-address",
        "person": {
            "id": 1,
            "name": "Example",
            "address": "example-address",
            "person": {
               ...
            }
        }
    }
}

相关问题