2017-02-21 50 views
2

В моей сущности У меня есть поля:Hibernate @CreationTimestamp @UpdateTimestamp Календаря

@UpdateTimestamp 
@Column 
private java.util.Calendar modifiedDate; 
@CreationTimestamp 
@Column 
private java.util.Calendar createdDate; 

Эти поля изменены спящий режим. Я вижу результат, сохраненный в БД. В БД сохранены данные без времени, как я мог бы объяснить, что спящий режим должен быть сохранен с текущим значением даты?


P.S. Я видел обходные пути, подобные аннотациям метода @PreUpdate@PrePersist Я не думаю, что мне это нужны.

ответ

2

Согласно спецификации JPA относительно типа данных календаря:

@Temporal - Это примечание должно быть указано для постоянных полей или свойств типа java.util.Date и java.util.Calendar ,

В вашем случае вы должны использовать:

@Temporal(TemporalType.TIMESTAMP) 

для обоих полей.

Другим решением было бы просто изменить от java.util.Calendar к java.sql.Timestamp:

@UpdateTimestamp 
@Column 
private java.sql.Timestamp modifiedDate; 
@CreationTimestamp 
@Column 
private java.sql.Timestamp createdDate; 
2

Я думаю, что вы можете использовать @CreationTimestamp и @UpdateTimestamp аннотаций, но вы должны указать TemporalType как Timestamp ,

@CreationTimestamp 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "createdDate") 
private java.util.Calendar createdDate; 

@UpdateTimestamp 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "modifiedDate") 
private java.util.Calendar modifiedDate; 

В противном случае, как вы сказали, что вы можете использовать @PrePersist и @PreUpdate следующим образом:

@PrePersist 
protected void onCreate() { 
    created = Calendar.getInstance(); 
} 

@PreUpdate 
protected void onUpdate() { 
    updated = Calendar.getInstance(); 
} 
2

Я рассмотрел альтернативный способ решения с помощью пружины, она отлично работает, и легко перенести данные в тестах. Original description.