2017-04-25 25 views
0

我Enity与现场节约场

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

虽然我在做使用Hibernate这方面的更新更改日期为当前一个自动

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

蝙蝠我想,当更新时间只设置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); 

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

+0

别忘了接受帮助你的答案... – Cepr0

回答

0

根据UpdateTimestamp文档

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

我想你将不得不删除它,做手工所要求的occassions

0

您使用的是批量更新语句,这意味着用户实体在执行不是由实体管理器进行管理该更新,所以时间戳将不会自动更新。

下会导致时间戳进行更新......

User user = userRepository.findOne(userId); 
user.setEmail(email); 
userRepository.save(user); 
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())); 
} 
+0

使用Timestamp.valueOf(LocalDateTime.now())为手动为我工作的字段设置日期。 – WallTearer