我有一个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);
哪个还给我
但是我无法通过邮递员发布数据。我已经尝试过了
{
"comment": "third comment",
"userId": 2,
"projectId" : 3,
"parentCommentId" : 2
}
插入数据,但返回userId
,projectId
和parentCommentId
为空。
我也尝试过这个。
{
"comment": "third comment",
"user": {
"userId" : 2
}
}
这给了我500错误。
答案 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
}
您正在明确定义RegisteredUser
,Project
和Comment
。 Spring并不真正知道JSON中的属性userId
对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用于请求/响应对象的原因之一。