Ситуация
У меня есть устойчивый класс с переменной типа java.util.Date:
import java.util.Date;
@Entity
@Table(name = "prd_period")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Period extends ManagedEntity implements Interval {
@Column(name = "startdate_", nullable = false)
private Date startDate;
}
Соответствующая таблица в БД:
CREATE TABLE 'prd_period' (
'id_' bigint(20) NOT NULL AUTO_INCREMENT,
...
'startdate_' datetime NOT NULL
)
Затем я сохраняю объект Period в DB:
Period p = new Period();
Date d = new Date();
p.setStartDate();
myDao.save(p);
После этого, если я пытаюсь извлечь свой объект из БД, он возвращается с переменной startDate типа Timestamp - и все места, где я пытаюсь использовать equals (...), возвращают false.
Вопрос: есть ли какие-либо способы заставить Hibernate возвращать даты как объект типа java.util.Date вместо Timestamp без явной модификации каждой такой переменной (например, он должен иметь возможность просто работать, без явной модификации существующих переменных типа java.util.Date)?
Примечание:
Я нашел количество явных решений, в которых используются аннотации или изменен сеттер, но у меня много классов с Date-variables, поэтому мне нужно некоторое централизованное решение, и все, что описано ниже, недостаточно хорошее:
-
Использование аннотации @Type: - будет возвращен java.sql.Date
@Column @Type(type="date") private Date startDate;
-
Использование аннотации @Temporal (TemporalType.DATE) - будет возвращен java.sql.Date
@Temporal(TemporalType.DATE) @Column(name="CREATION_DATE") private Date startDate;
-
Изменив сеттер (глубокая копия) - будет возвращен java.util.Date
public void setStartDate(Date startDate) { if (startDate != null) { this.startDate = new Date(startDate.getTime()); } else { this.startDate = null; } }
-
Создав свой собственный тип: - будет возвращен java.util.Date
Подробности приведены здесь: http://blogs.sourceallies.com/2012/02/hibernate-date-vs-timestamp/