我们正在使用一个非常旧的数据库,其中日期在数据库中以数值形式存储为 YYYYMMDD
,例如,今天(2014 年 7 月 16 日)它将存储为 20140716
.
我们目前正在通过实现我们自己的 AttributeConverter<Date, Long>
来解决这个问题它将 Date
转换为反对 Long
反之亦然。
但是,数据库还存在一个限制,不允许 NULL
列中的值。该列本身是可选的,但如果日期不存在,则日期应保留为零 ( 0
),而不是 NULL
.
那么,我们在 AttributeConverter
中做了什么如下:
@Override
public Long convertToDatabaseColumn(Date input) {
Long out = 0L;
if (input != null) {
Calendar cal = GregorianCalendar.getInstance();
cal.setTime(input);
out += (cal.get(Calendar.YEAR) * 10000);
out += (cal.get(Calendar.MONTH) + 1) * 100;
out += cal.get(Calendar.DAY_OF_MONTH);
}
return out;
}
但是在调试时我们注意到当日期为null
时我们的转换器没有执行。 ,所以它永远不会转换为零。
有没有办法我们仍然可以强制 Hibernate (4.3.5.Final) 使用我们的转换器,即使该值为 null
?
最佳答案
正如您所发现的,这似乎是一个已报告的 BUG here .
典型的解决方法(在 JPA<2.1 中完美运行)是将该列映射到一个简单的(即没有 AttributeConverter)
Long
字段/属性并隐藏它(将其设为私有(private))并公开另一个转换它的 Date
类型的字段。
关于java - JPA/Hibernate 映射 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24778346/