Spring JPA:创建的时间戳在后续调用保存函数后被刷新

Spring JPA: created timestamp getting flushed after subsequent call to save function

我关注class:

@Entity
@Table(name = "payment")
public class Payment {

   @Id
   private String transactionId;

   @CreationTimestamp
   private Timestamp createdTime;

   @UpdateTimestamp
   private Timestamp lastModifiedTime;

}

我正在扩展 JPARepository

public interface PaymentRepository extends JpaRepository<Payment, Serializable> {
}

在我的服务中 class 我按以下方式调用保存函数 2 次:

paymentRepository.save(payment);
/* Some statements (can be some modifications to payment object)*/
paymentRepository,save(payment);

最后我在数据库中发现 createdTime 的值为 NULL。如果第二条保存语句未执行,那么 createdTime 时间戳的值将按预期呈现。

如何才能不丢失创建的时间戳?

来自CrudRepositoryAPI documentation

<S extends T> S save(S entity) 保存给定的实体。 将返回的实例用于进一步的操作,因为保存操作可能已完全更改实体实例。

因此您的代码应为:

Payment p = paymentRepository.save(payment);
/* Some statements (can be some modifications to payment object)*/
Payment p2 = paymentRepository.save(p);

至少我猜是这样,如果这不能解决您的问题,请提供更多信息。 (即您使用哪个 JPA 提供程序?)

我同意罗宾的回答,但另外,一次交易中可以运行多次调用保存方法。如果您想确定数据库上的第一个命令 运行,我的建议是使用 saveAndFlush() 方法。

当您使用saveAndFlush()方法时,您还提交了现有事务,以便您可以安全地使用该实例。

注意:但是有可能你增加了到DB的事务数。