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 时间戳的值将按预期呈现。
如何才能不丢失创建的时间戳?
来自CrudRepository
的API 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的事务数。
我关注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 时间戳的值将按预期呈现。
如何才能不丢失创建的时间戳?
来自CrudRepository
的API 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的事务数。