当在持久化操作期间进行更改时,hibernate将创建日期设置为空



我正在创建一个课程对象,并使用hibernate在H2数据库中持久化,并使用@CreationTimestamp注释设置创建日期

@Entity
@Table(name = "COURSE_DETAILS")
public class Course {
@Id
@GeneratedValue
private Long id;
@Column(name="NAME", nullable = false)
private String name;
@UpdateTimestamp
private LocalDateTime lastUpdatedDate;
@CreationTimestamp
private LocalDateTime createdDate;
// constructors and getter and setters
}
@Repository
@Transactional
public class CourseRepository {
@Autowired
private EntityManager entityManager;
public void play(){
Course course = new Course("New Course");
entityManager.persist(course);
course.setName("Not null");
}
}

我在数据库中得到以下条目

ID CREATED_DATE LAST_UPDATED_DATE NAME

1 null 2021-10-06 22:31:43.465 Not null

但是当我把代码改成
Course course = new Course("New Course");
entityManager.persist(course);
course.setName("Not null");
entityManager.flush();

我在db中得到以下条目
ID create_date LAST_UPDATED_DATE名称
1 2010-10-06 22:38:37.941不空

为什么在第一种情况下将创建日期设置为空。

我很快就试了一下,效果很好。我正在分享实际的代码,希望你能从中受益。

首先,这是我的pom.xml。我使用Java11,从依赖关系的角度来看,只有我有h2数据库和spring-data-jpa。

<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

然后,那个和你几乎一样的实体。

@Entity
@Table(name = "course")
public class Course
{
@Id
@GeneratedValue
private Long id;
@Column(name="NAME", nullable = false)
private String name;
@UpdateTimestamp
private LocalDateTime lastUpdatedDate;
@CreationTimestamp
private LocalDateTime createdDate;
}

最后一个是查询。

public void saveCourses()
{
Course course = new Course();
course.setName("Course New!");
em.persist(course);
Course retrieved = (Course) em.createQuery("SELECT c FROM Course c")
.getSingleResult();
System.out.println(retrieved.getName() + ", " + retrieved.getCreatedDate() + ", " + retrieved.getLastUpdatedDate());
retrieved.setName("Course New2!");
em.persist(retrieved);
retrieved = (Course) em.createQuery("SELECT c FROM Course c")
.getSingleResult();
System.out.println(retrieved.getName() + ", " + retrieved.getCreatedDate() + ", " + retrieved.getLastUpdatedDate());
}

我是如何保存created_by和created_date的

@CreatedBy
@Column(updatable = false)
private String createdBy;
@CreatedDate
@Column(updatable = false)
private Date createdAt;

不幸的是,我也无法找出为什么字段在更新时为空,但是这个解决方案确实可以防止它们被空。

在我的案例中,使用saveAndFlush(Entity)代替save(Entity)解决了问题。

最新更新