通过在帖子正文中添加新评论来更新帖子实体时,出现以下错误:
关系帖子的“creation_date”列中的空值
当我在 Post @PrePersist 和 @PreUpdate 中调试时,我发现创建日期不为空,但是 然后我得到了错误。 评论是否持续发生在帖子更新之前?
我不想使用@CreationTimestamp,因为我需要具体的日期。
编辑: 根据我在网上做的研究,首先是父母坚持,然后是孩子。 creationDate 列不可为空可能是问题背后的原因。看起来 hibernate 正在对初始值进行一些验证。只要不提供 @CurrentTimestamp 注释,即使稍后设置该属性,该属性也被视为 null。 因此,我初始化了日期,错误消失了,并且设置了 Post prepersit 和 preupdate 中定义的值。 但我仍然不明白为什么休眠会这样工作。也许有人可以详细说明
import jakarta.persistence.*;
import java.util.HashSet;
import java.util.Set;
@Entity
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "post")
private Set<Comment> comments= new LinkedHashSet<>();
@PrePersist
@PreUpdate
private void prepersist(){
// loop through comments
// set date to custom date
comment.creationDate = LocalDateTime.now().plusMinutes(index)
}
}
import jakarta.persistence.*;
import java.time.LocalDateTime;
@Entity
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name="creation_date", nullable=false)
private LocalDateTime creationDate;
@ManyToOne
@JoinColumn(name = "post_id")
private Post post;
}
使用 @PrePersist 注解的方法将在第一次保存关联实体之前执行。
@PreUpdate 注解的方法将在关联实体更新之前执行。
参考这个
因此,如果您打算在保存和更新评论实体之前将日期/时间添加到评论实体中,那么您可以执行以下操作:-
import jakarta.persistence.*;
import java.util.HashSet;
import java.util.Set;
@Entity
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "post")
private Set<Comment> comments= new LinkedHashSet<>();
}
import jakarta.persistence.*;
import java.time.LocalDateTime;
@Entity
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name="creation_date", nullable=false)
private LocalDateTime creationDate;
@ManyToOne
@JoinColumn(name = "post_id")
private Post post;
@PrePersist
@PreUpdate
private void prepersist(){
//your logic to set the date and time
}
}
当您保存或更新帖子实体时,先持久化父实体(帖子),然后持久化子实体(评论)。
因此你的做法是行不通的。
如果您需要任何其他说明请在下面评论。