JPA/Hibernate 创建日期不能为空

问题描述 投票:0回答:1

通过在帖子正文中添加新评论来更新帖子实体时,出现以下错误:

关系帖子的“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;
}
java hibernate spring-data-jpa
1个回答
0
投票

使用 @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
    }
}

当您保存或更新帖子实体时,先持久化父实体(帖子),然后持久化子实体(评论)。

因此你的做法是行不通的。

如果您需要任何其他说明请在下面评论。

© www.soinside.com 2019 - 2024. All rights reserved.