【问题标题】:How to work with zero dates ("0000-00-00") in Hibernate?如何在 Hibernate 中使用零日期(“0000-00-00”)?
【发布时间】:2010-11-21 01:19:14
【问题描述】:

我有一个 MySql 表,它的默认值为零(“0000-00-00”)的日期字段(字段不能为空,我不能更改表结构)。 Hibernate 不喜欢零日期,并在读取或保存期间抛出异常。

我设法通过设置 MySql 连接设置“zeroDateTimeBehavior=convertToNull”使其读取记录,该设置在检索记录时将零日期转换为空值。在我尝试保存日期为空的记录之前,一切正常 - 它抛出日期不能为空的异常。

所以问题是 - 如何通过 Hibernate 保存记录,以便日期在表格中显示为零?

谢谢。

【问题讨论】:

  • 你为什么要处理它们呢?零约会——出去庆祝耶稣的生日!这么重要的时刻,你为什么要在电脑前!
  • 儒略历和公历中不存在零年——它直接从公元前 1 年跳到公元 1 年。我真的不能为此责怪 Hibernate。
  • 即使年份有效,也不允许使用零月份和日期。

标签: mysql hibernate


【解决方案1】:

适用于 DATE '0000-00-00' 和 TIME '00:00:00' 的现成可用解决方案:How to map MySQL DATE '0000-00-00' & TIME '00:00:00' with Hibernate

感谢 Preston 提供代码,感谢 ChssPly76 提供有用的 cmets。

【讨论】:

    【解决方案2】:

    我会尝试添加一个 Hibernate 拦截器(APIDoc)并尝试在 onSave() 方法中实现一些东西。

    以下代码可能有效:

    static final Date ZERO_DATE = //0000-00-00
    
    public boolean onSave(Object entity,
                      Serializable id,
                      Object[] state,
                      String[] propertyNames,
                      Type[] types)
               throws CallbackException {
        for(int i = 0; i< propertyNames.length; i++) {
            if(propertyNames[i].equals("dateFieldName") && state[i]==null) {
                state[i] = ZERO_DATE;
                return; //or may continue, if there are several such fields.
            }
        }
    }
    

    【讨论】:

    • 但是 ZERO_DATE 到底是什么?
    • 只有零的日期字段的 java 表示。
    • 你能举个例子吗? java中没有全零日期这样的东西,这就是零日期存在问题的原因。
    • 没有像全零日期这样的东西anywhere。 MySQL 中的那个东西不是日期值。
    猜你喜欢
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 2011-08-23
    • 2017-09-21
    • 2013-07-12
    • 1970-01-01
    • 2018-07-31
    • 2015-11-28
    相关资源
    最近更新 更多