Как опубликовать сущность ManyToOne и OneToOne в формате JSON? - PullRequest
0 голосов
/ 14 октября 2019

У меня есть comment сущность, которая имеет user_id и project_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
}

, который вставляет данные, но возвращает userId, projectId и parentCommentId как ноль.

, и я также пробовал это.

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

, что дает мне 500 ошибок.

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Как вы делаете, 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
}

Вы четко определяете RegisteredUser, Project и Comment. Spring на самом деле не знает, что свойство userId в вашем JSON относится к объекту RegisteredUser.

Я пробовал это

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

, которые вставляют данные, но возвращаютuserId, projectId и parentCommentId равны нулю.

Почему это происходит? Ваш класс Comment не определяет свойства userId, projectId, parentCommentId.

Это ожидаемое поведение десериализатора. Если вы не хотите создавать объект вручную (т. Е. С помощью DTO), вы должны указать десериализатору создать экземпляр RegisteredUser, Project и Comment (для parentComment).

Для этого вам просто нужно создать объект в вашем JSON.

Вместо этого:

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

Попробуйте это

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

Это работает,но гораздо более многословно, чем то, как вы пытаетесь вставить. Это одна из причин, по которой я всегда использую DTO для объектов запроса / ответа.

0 голосов
/ 14 октября 2019

Я думаю, что вы можете просто отправить userId, а затем получить данные на основе userId из user таблицы (любое имя, которое вы упомянули от пользователя).

почему вы отправляете полный объект в сообщении еготяжелый или вы можете использовать @Embedded аннотацию.

надеюсь, что это будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...