TBH, я не уверен в точном статусе этого, но действительно может быть проблема с тем, как Hibernate (который является вашим JPA-провайдером, верно?) Обрабатывает TIMESTAMP
столбцы.
Чтобы сопоставить SQL TIMESTAMP
с java.util.Date
, Hibernate использует TimestampType
, который фактически назначит java.sql.Timestamp
вашему атрибуту java.util.Date
. И хотя это «законно», проблема в том, что Timestamp.equals(Object)
является не симметричным (почему на земле ?!), и это нарушает семантику Date.equals(Object)
.
Как следствие, вы не можете «вслепую» использовать myDate.equals(someRealJavaUtilDate)
, если myDate
сопоставлен с SQL TIMESTAMP
, что, конечно, не совсем приемлемо.
Но хотя это широко обсуждалось на форумах Hibernate, например, в этой теме и этой (читать все страницы) кажется, что пользователи и разработчики Hibernate никогда не соглашались с этой проблемой (см. такие вопросы, как HB-681 ) и я просто не понимаю, почему.
Может быть, это только я, может быть, я просто упускаю что-то простое для других, но проблема выглядит очевидной для меня, и хотя я считаю этого глупого java.sql.Timestamp
виновником, я все же думаю, что Hibernate должен оградить пользователей от этой проблемы. Я не понимаю, почему Гэвин не согласился с этим.
Я бы предложил создать тестовый пример, демонстрирующий проблему (должен быть довольно простым), и сообщить о проблеме (снова), чтобы увидеть, получаете ли вы более положительные отзывы от текущей команды.
Между тем, вы можете использовать пользовательский тип, чтобы «решить» проблему самостоятельно, используя что-то вроде этого (взято с форума и вставлено как есть):
public class TimeMillisType extends org.hibernate.type.TimestampType {
public Date get(ResultSet rs, String name) throws SQLException {
Timestamp timestamp = rs.getTimestamp(name);
if (timestamp == null) return null;
return
new Date(timestamp.getTime()+timestamp.getNanos()/1000000);
}
}