如何使用JSON格式发布ManyToOne和OneToOne实体?

时间:2019-10-14 09:37:58

标签: java spring-boot gradle spring-data-jpa

我有一个comment实体,其中有user_idproject_id作为外键。并且注释可以在parent_commnent_id提到的同一张表中具有父子关系。

import com.fasterxml.jackson.annotation.JsonIgnore;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table
public class Comment {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "comment_id")
    private int commentId;

    @ManyToOne
    @JsonIgnore
    @JoinColumn(name = "project_id")
    private Project projectId;

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

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id", referencedColumnName = "user_id")

    private RegisteredUser user;

    @ManyToOne
    @JsonIgnore
    @JoinColumn(name = "Parent_comment_id")
    public Comment ParentCommentId;

    @OneToMany(mappedBy = "ParentCommentId")
    public List<Comment> childComments = new ArrayList<Comment>();

    public int getCommentId() {
        return commentId;
    }

    public void setComment(String comment) {
        this.comment = comment;
    }

    public Project getProjectId() {
        return projectId;
    }

    public void setProjectId(Project projectId) {
        this.projectId = projectId;
    }

    public RegisteredUser getUser() {
        return user;
    }

    public void setUser(RegisteredUser user) {
        this.user = user;
    }

    public String getComment() {
        return comment;
    }

    public void setCommentId(int commentId) {
        this.commentId = commentId;
    }
}

我手动插入了一些数据

INSERT INTO comment (comment, Parent_comment_id, project_id, user_id) VALUES ( 'first comment', null, 1, 1);
INSERT INTO comment (comment, Parent_comment_id, project_id, user_id) VALUES ( 'first child comment', 1, 1, 2);

哪个还给我

enter image description here

但是我无法通过邮递员发布数据。我已经尝试过了

{
    "comment": "third comment",
    "userId": 2, 
    "projectId" : 3,
    "parentCommentId" : 2
}

插入数据,但返回userIdprojectIdparentCommentId为空。

我也尝试过这个。

{    
     "comment": "third comment",
     "user": {
            "userId" : 2
        }
}

这给了我500错误。

2 个答案:

答案 0 :(得分:0)

我认为您可以简单地发送userId,然后根据userId表(您从用户提及的任何名称)中基于user提取详细信息。

为什么要在重物后发送完整的对象,或者可以使用@Embedded批注。

希望它会起作用。

答案 1 :(得分:0)

您正在做的事情,Spring希望您的JSON是这样的:

{
    "comment": "Foo bar",
    "projectId": {
        "id": 123,
        ..other properties..
    },
    "user": {
        "id": 1
        ..other properties..
    },
    "parentCommentId": {
        "id": 456
        ..other properties..
    },
    "childComments": [
        {   
            "id": 789
            ..other properties..
        }
    ]
}

另一方面,您要像这样插入:

{
    "comment": "third comment",
    "userId": 2, 
    "projectId" : 3,
    "parentCommentId" : 2
}

您正在明确定义RegisteredUserProjectComment。 Spring并不真正知道JSON中的属性userIdRegisteredUser对象的作用。

  

我已经尝试过了

{
    "comment": "third comment",
    "userId": 2, 
    "projectId" : 3,
    "parentCommentId" : 2
}
     

插入数据,但将userId,projectId和parentCommentId返回为   空。

为什么会这样? 好吧,您的Comment类没有定义userIdprojectIdparentCommentId属性。

这是解串器的预期行为。如果您不想手动创建对象(即使用DTO),则必须告诉反序列化器创建RegisteredUserProjectComment的实例(对于parentComment)。

为此,您只需在JSON中创建对象。

代替此:

{
    "comment": "third comment",
    "userId": 2, 
    "projectId" : 3,
    "parentCommentId" : 2
}

尝试一下

{
    "comment": "Foo bar",
    "projectId": {
        "projectId": 3
    },
    "user": {
        "userId": 1
    },
    "parentCommentId": {
        "commentId": 2
    }
}

这有效,但是比您尝试插入的方式冗长得多。这就是我始终将DTO用于请求/响应对象的原因之一。