【问题标题】:Creating jpa entity with self reference使用自引用创建 jpa 实体
【发布时间】:2020-12-17 07:21:10
【问题描述】:

我有 pojo,需要使用一对一映射进行自我引用。我正在使用flyway来调出桌子。该应用程序启动正常,但是当我尝试执行获取请求时,我收到以下错误:

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;

}

【问题讨论】:

    标签: java sql hibernate spring-data-jpa


    【解决方案1】:

    错误信息来自杰克逊。因此,它在转换为 java 对象或返回 json/xml 时失败,而不是在将其写入数据库时​​失败。

    问题是生成的 JSON 对象可能包含另一个 Person-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": {
                   ...
                }
            }
        }
    }
    

    【讨论】:

    • 我该如何解决这个问题?
    • 您可以将“人”属性映射到人的 id 而不是整个人对象:logicbig.com/tutorials/misc/jackson/…
    • 你能举个例子说明我如何在我的代码中做到这一点吗?
    • 它或多或少与页面上的解释完全相同:将 @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") 添加到您的类和 @JsonIdentityReference(alwaysAsId = true)到“人”属性。我发给你的网站上有一个例子。也许删除@JsonManagedReference
    • 我已经添加了所需的注释。仍然遇到同样的错误
    猜你喜欢
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多