Spring数据如何处理/检索由触发器而不是自身填充的数据?
我对Spring数据+MySQL触发器有问题 目前,在表中插入新行之前,MySQL触发器会将数据分配给特定列: 表格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填充数据,但是在创建和在更新,我的意思是,当我为用
用户
列在
处创建和更新
这些列映射如下:
@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