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 更新还包含日期字段的实体字段的主要内容,如果未能解决你的问题,请参考以下文章
Spring Hibernate JPA 联表查询 复杂查询