Hibernate/JPA - 使用@Future 更新还包含日期字段的实体字段

Posted

技术标签:

【中文标题】Hibernate/JPA - 使用@Future 更新还包含日期字段的实体字段【英文标题】:Hibernate/JPA - Update an entity field that also contains a date field with @Future 【发布时间】:2021-05-30 15:34:55 【问题描述】:

我有一个带有@Future 注释的日期字段的实体。我最初使用 repository.save(data) 以给定的日期(假设明天的日期 5/31/21)创建记录/交易。 - 工作正常!

public class data

  @Future
  private Date date;

  private String status;


2021 年 5 月 31 日

data data = new data(LocalDateTime.now(), "initialstatus")
repository.save(data);

然后我在 21 年 6 月 1 日进来并更新了一个名为“status”的不同字段,但是当我进行更新时,我收到一个错误,即无法提交事务,我猜是因为它是在尝试更新状态字段时,尝试将 21 年 5 月 31 日的日期保存在 21 年 6 月 1 日的 @Future 日期字段中(此时不是未来日期)。

2021 年 6 月 1 日

data data = repository.findById(id).get();
data.setStatus("updatedstatus");
repository.save(data);
2021-05-30 09:46:13.597 DEBUG 10984 --- 
[nio-8080-exec-9] .m.m.a.ExceptionHandlerExceptionResolver : Resolved
[org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; 
nested exception is javax.persistence.RollbackException: 
Error while committing the transaction]

删除@Future 后,我可以更新状态字段,所以我的问题是如何只更新状态字段而不是失败的日期字段,因为日期现在已经过去了。

【问题讨论】:

【参考方案1】:

如果您只需要在插入时使用验证组进行验证,似乎可以这样做。 这是否回答了您的问题:Hibernate validations on save (insert) only?

【讨论】:

是的,小组可以工作,我只是不想组建一个小组来做一件简单的事情(或者至少我希望很简单)【参考方案2】:

尝试将@Column注解的updatable属性设置为false

@Column(updatable= false)
@Future
private Date date;

updatable 属性指示 Hibernate 从生成的UPDATE SQL 语句中省略此列。

【讨论】:

【参考方案3】:

您可以使用@DynamicUpdate。实体将使用动态 sql 生成,其中仅引用更改的列。

@DynamicUpdate
public class data

  @Future
  private Date date;

  private String status;


【讨论】:

以上是关于Hibernate/JPA - 使用@Future 更新还包含日期字段的实体字段的主要内容,如果未能解决你的问题,请参考以下文章

直接加入 JPA 或 HIBERNATE

Spring Hibernate JPA 联表查询 复杂查询

Spring + Hibernate + JPA [关闭]

JPA/Hibernate 无法创建名为 Order 的实体

访问字段时出错(使用 Hibernate/JPA)

hibernate/JPA 中的 @PreUpdate 和 @Prepersist(使用会话)