java - JPA/Hibernate 映射 null

标签 java hibernate jpa

我们正在使用一个非常旧的数据库,其中日期在数据库中以数值形式存储为 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/

相关文章:

java - 具有集合的JPA实体针对分离成员上的contains方法返回false

java - 当我点击同一个 url 超过 4 次时,Dao 类没有得到任何响应

spring - Spring测试的 Autowiring 问题

java - Hibernate、MySQL 和 Maven : am I losing my configuration?

Java Regex 在匹配中包含新行

java - 使用最小样板提交 Spring 表单

java - 为什么 hasNextInt() 在这里返回 false ?

java - Hibernate 或 hsql 不考虑列长度

java - JPA和Hibernate中@MapKey、@MapKeyColumn和@MapKeyJoinColumn的区别

java - 是否有仅包含来自 JPA 的注释的 JAR?