Java Spring Hibernate-自连接多对多实体can';不能更新
我正在尝试向父对象添加Java Spring Hibernate-自连接多对多实体can';不能更新,java,spring,hibernate,Java,Spring,Hibernate,我正在尝试向父对象添加注释,如果它属于父对象注释是一个自连接的多对多实体,如下所示 在这个函数中,我通过getParentId()搜索parentId,试图找到注释是否属于父项 如果不为null,则必须存在父级,因此,找到此父级,并将此注释实例添加为父级的子命令集合之一 我似乎无法正确地持久化新添加的子元素 public ResponseEntity<Comment> addComment(Comment comment) { Comment newComment = com
注释,如果它属于父对象<代码>注释
是一个自连接的多对多实体,如下所示
在这个函数中,我通过getParentId()
搜索parentId
,试图找到注释是否属于父项
如果不为null,则必须存在父级,因此,找到此父级,并将此注释
实例添加为父级的子命令
集合之一
我似乎无法正确地持久化新添加的子元素
public ResponseEntity<Comment> addComment(Comment comment) {
Comment newComment = commentRepository.save(comment);
if (newComment.getParentId() != null) {
Comment parent = commentRepository.findById(newComment.getParentId()).orElse(null);
if (parent != null) {
Set<Comment> parentSubcComment = parent.getSubComments();
parentSubcComment.add(newComment);
parent.setSubComments(parentSubcComment);
commentRepository.save(parent);
}
}
return ResponseEntity.ok(newComment);
}
public responseenty addComment(注释){
Comment newComment=commentRepository.save(Comment);
if(newComment.getParentId()!=null){
Comment parent=commentRepository.findById(newComment.getParentId()).orElse(null);
如果(父项!=null){
设置parentsubcomment=parent.getsubcomment();
parentsubcomment.add(新成员);
parent.setSubComments(parentsubcomments);
commentRepository.save(父级);
}
}
返回响应。ok(新成员);
}
Comment.java实体类
import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashSet;
import java.util.Set;
@Entity
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String id;
private String text;
@CreationTimestamp
private LocalDateTime createDateTime;
@OneToMany(mappedBy = "parentComment")
private Set<Comment> subComments = new HashSet<>();
@ManyToOne
@JoinColumn(referencedColumnName = "id")
private Comment parentComment;
private int likeCount = 0;
private boolean isParent;
private String parentId;
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public Set<Comment> getSubComments() {
return subComments;
}
public void setSubComments(Set<Comment> subComments) {
this.subComments = subComments;
}
public Comment getParentComment() {
return parentComment;
}
public void setParentComment(Comment parentComment) {
this.parentComment = parentComment;
}
public boolean getIsParent() {
return isParent;
}
public void setIsParent(boolean isParent) {
this.isParent = isParent;
}
public int getLikeCount() {
return likeCount;
}
public void incLikeCount() {
this.likeCount++;
}
public String getCreateDateTime() {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy @ hh:mm a");
return createDateTime.format(formatter);
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
@Override
public String toString() {
return "id: " + id + " text: " + text + " isParent: " + isParent + " parentId: " + parentId;
}
}
import org.hibernate.annotations.CreationTimestamp;
导入javax.persistence.*;
导入java.time.LocalDateTime;
导入java.time.format.DateTimeFormatter;
导入java.util.HashSet;
导入java.util.Set;
@实体
公开课评论{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私有字符串id;
私有字符串文本;
@CreationTimestamp
私有LocalDateTime createDateTime;
@OneToMany(mappedBy=“parentComment”)
private Set subcents=new HashSet();
@许多酮
@JoinColumn(referencedColumnName=“id”)
私人评论;
private int likeCount=0;
私有布尔值是公共的;
私有字符串parentId;
公共字符串getParentId(){
返回parentId;
}
public void setParentId(字符串parentId){
this.parentId=parentId;
}
公共集合getSubComments(){
返回子命令;
}
public void setSubComments(Set subComments){
this.subcents=subcents;
}
公共评论getParentComment(){
返回parentComment;
}
public void setParentComment(Comment parentComment){
this.parentComment=parentComment;
}
公共布尔getIsParent(){
返回isParent;
}
公共void setIsParent(布尔isParent){
this.isParent=isParent;
}
public int getLikeCount(){
返回式计数;
}
公共无效incLikeCount(){
这个.likeCount++;
}
公共字符串getCreateDateTime(){
DateTimeFormatter formatter=DateTimeFormatter.of模式(“mm dd,yyyy@hh:mm a”);
返回createDateTime.format(格式化程序);
}
公共字符串getId(){
返回id;
}
公共无效集合id(字符串id){
this.id=id;
}
公共字符串getText(){
返回文本;
}
公共void setText(字符串文本){
this.text=文本;
}
@凌驾
公共字符串toString(){
返回“id:+id+”text:+text+“isParent:+isParent+”parentId:+parentId;
}
}
您应该更新parentComment的实体并添加cascade属性
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(referencedColumnName = "id")
private Comment parentComment;
@JoinColumn
中的parentComment
属性的名称是什么?现在它看起来像一个默认的-Id。尝试添加@JoinColumn(name=“parentId”)
@YuriyTsarkov我想我不明白你的问题。我认为这只是现在的默认值,如果您询问联接列的名称。我认为这里的设计不好,因为添加一个子元素,您从db查询现有子元素,然后添加新注释作为子元素。如果有很多子命令会发生什么?@GauravSrivastav你是说使用setSubComments
不好吗?如果是这样的话,我可以很容易地添加一个方法来添加新的注释
。我知道设计可能很糟糕,但我眼前的问题是,在我添加了一个新的COMMETW后,我无法更新我的db。您会得到什么错误?您能解释一下cascade如何帮助更新吗?我试过了,结果还是一样,空的子元素