Spring数据如何处理/检索由触发器而不是自身填充的数据?

Spring数据如何处理/检索由触发器而不是自身填充的数据?,spring,spring-boot,spring-data-jpa,spring-data,Spring,Spring Boot,Spring Data Jpa,Spring Data,我对Spring数据+MySQL触发器有问题 目前,在表中插入新行之前,MySQL触发器会将数据分配给特定列: 表格用户 列在处创建和更新 这些列映射如下: @Column(name = "created_at") private Date createdAt; @Column(name = "updated_at") private Date updatedAt; 类似地,我有一个服务(注释为@Transactional),它用实例User填充数据,但是在创建和在更新,我的意思是,当我为用

我对Spring数据+MySQL触发器有问题

目前,在表中插入新行之前,MySQL触发器会将数据分配给特定列:

表格
用户

处创建和更新

这些列映射如下:

@Column(name = "created_at")
private Date createdAt;

@Column(name = "updated_at")
private Date updatedAt;
类似地,我有一个服务(
注释为@Transactional
),它用实例
User
填充数据,但是
创建和
更新,我的意思是,当我为
用户存储库
调用
保存
时,这些属性将变为
null

MySQL在将(触发器)插入数据库之前,这两个属性都使用MySQL函数
utc\u timestamp()
填充

我的问题:


在调用服务
saveUSer
之后,我正在从存储库调用
findById
。为什么在
创建的属性和在
更新的属性在实例中都有空值(在db中它们有值)?

保存用户后,实例将缓存在
EntityManager
中。如果
findById
的调用仍在用于保存用户的同一事务中,它将只返回缓存在
EntityManager
中的用户实例,其中
createdAt
updatedAt
为空

在JPA中,我们可以调用
entityManager.refresh(user)
强制从DB中选择该用户,这样JPA管理的用户实例将具有最新的值作为DB记录。因此,您可以在保存用户后使用
entityManager.refresh(user)
,以确保
createdAt
updatedAt
的最新值被更新回JPA管理的用户实例


但是,Spring data的JPA存储库不公开EntityManager的
刷新
,您可以对其进行扩展。

另一个答案相当准确,但它假设您从事务内部调用
saveUser
findById
。 然而,当您在SpringBoot下使用SpringDataJPA时,即使您没有事务,也可能发生此问题

Spring Boot有一个默认设置,可以自动将每个请求封装在事务中。 因此,如果使用Spring Boot,则值得尝试将以下行添加到application.properties:
spring.jpa.openin-view=false