我遇到了一个奇怪的问题上次修改日期没有自动更新。我正在使用Postgresql版本12.3和Springboot 2.2.4.RELEASE这是我的实体类
@Entity
@Table(name = "users")
@org.hibernate.annotations.Entity(
dynamicUpdate = true
)
@Data
public class Users {
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(
name = "UUID",
strategy = "org.hibernate.id.UUIDGenerator"
)
@Column(updatable = false, nullable = false)
private String userId;
private String userName;
private String userEmail;
private String userPhoneNumber;
@CreationTimestamp
@Column(updatable = false)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+05:30")
private Timestamp createdOn;
@UpdateTimestamp
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+05:30")
private Timestamp lastUpdatedOn;
}
数据库记录:
createdon | lastupdatedon
2020-08-27 07:43:37.994 | 2020-08-27 07:43:37.994
2020-08-07 07:49:22.797 | 2020-08-07 07:49:22.797
2020-08-12 13:38:43.503 | 2020-08-12 13:38:43.503
您可以看到createdOn和lastUpdatedOn是相同的。即使经常更新记录,上次修改日期也不会更新。
我正在使用jpa存储库保存记录,例如:
usersRepository.save(user);
2条答案
按热度按时间pxyaymoc1#
您是否可以尝试使用PrePersist & PreUpdate注解而不是CreationTimestamp & UpdateTimestamp来对实体进行更多控制,并应用于以下内容-
fzwojiic2#
您是否碰巧在事务中调用了保存方法?
时间戳在写入DB时填充,因此在提交事务 * 之后 * 才能看到它们的值。
当我遇到这个问题时,我的代码如下所示:
有两种解决方案:
1.如果数据库事务中的另一个实体需要日期,则可以使用
saveAndFlush
而不是save
。这将强制写入数据库,返回创建和修改的日期。1.否则,请将
save
调用重构为另一个方法,并使用@Transactional
对该方法进行注解。我选择了选项(2),如下所示:
请注意,要使事务注解正常工作,调用不能是自调用的(即必须在另一个类上调用),并且方法必须是公共的。