【问题标题】:Updating time when saving a field保存字段时的更新时间
【发布时间】:2017-09-23 03:15:26
【问题描述】:

我有一个带字段的实体

@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "updateDate")
private Date updateDate;

当我使用 Hibernate 进行更新时,此字段会自动将日期更改为当前日期

session.save(user); //IT'S OK

bat 我只想通过 Spring Data 设置电子邮件

@Transactional
@Modifying
@Query("update User e set e.email = :email where e.id = :id")
public void setEmail(@Param("id") Long id, @Param("email") String email);

虽然电子邮件更改不是当前时间的字段。为什么?

【问题讨论】:

  • 别忘了接受对你有帮助的答案...

标签: java spring hibernate spring-data


【解决方案1】:

尝试使用这个(未测试):

@Transactional
@Modifying
@Query("
    update User e 
    set e.email = :email, 
    e.updateDate = ?#{T(java.sql.Timestamp).valueOf(
        T(java.time.LocalDateTime).now()
    )}
    where e.id = :id
")
public void setEmail(@Param("id") Long id, @Param("email") String email);

SpEL support in Spring Data JPA @Query definitions

甚至是这个变种:

@Transactional
@Modifying
@Query("
    update User e set 
    e.email = :email, 
    e.updateDate = :curTime 
    where e.id = :id
")
void setEmail(
    @Param("id") Long id, 
    @Param("email") String email, 
    @Param("curTime") Timestamp curTime)
)

default void setEmail(Long id, String email) {
    setEmail(id, email, Timestamp.valueOf(LocalDateTime.now()));
}

【讨论】:

  • 使用 Timestamp.valueOf(LocalDateTime.now()) 为我手动工作的字段设置日期。
【解决方案2】:

根据UpdateTimestamp文档

将属性标记为包含实体的更新时间戳。每当更新拥有实体时,属性值将设置为当前 VM 日期。

我猜你必须删除它并在需要的情况下手动执行

【讨论】:

    【解决方案3】:

    您正在使用批量更新语句,这意味着用户实体在执行更新时不受实体管理器的管理,因此时间戳不会自动更新。

    以下将导致时间戳被更新...

    User user = userRepository.findOne(userId);
    user.setEmail(email);
    userRepository.save(user);
    

    【讨论】:

      猜你喜欢
      • 2018-06-29
      • 2021-12-08
      • 2019-05-30
      • 1970-01-01
      • 2013-03-27
      • 2021-08-11
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      相关资源
      最近更新 更多