列的值太长 - 错误持久化LocalDate

Deb*_*Deb 3 java hibernate date java-8

我在持久化LocalDate字段时遇到以下错误[在列中使用VARCHAR(20)类型]:

Value too long for column "BIRTH_DATE VARCHAR(20)":"'aced00057372000d6a6176612e74696d652e536572955d84ba1b2248b20c00007870770703000007e2060c78' (88)";
Run Code Online (Sandbox Code Playgroud)

字段定义如下:

@Column(name = "BIRTH_DATE")
private LocalDate date;
@Column(name = "BIRTH_TIME")
private LocalTime time;
Run Code Online (Sandbox Code Playgroud)

我正在使用spring数据启动器(1.5.9.RELEASE).其中内部使用hibernate 5.0.12.

根据博客文章https://www.thoughts-on-java.org/hibernate-5-date-and-time/

Hibernate 5,支持开箱即用的Java 8功能(DateTime API).那么,为什么会出现这个错误.

我已经检查过,并且在运行时创建了一个有效的LocalDate对象.但是持续存在时会抛出错误.这是调用之前的调试屏幕截图save() 在此输入图像描述

如果我将列类型更改为DATE,则错误将更改为以下内容:

java.lang.IllegalArgumentException: aced00057372000d6a6176612e74696d652e536572955d84ba1b2248b20c00007870770703000007e2060c78
    at org.h2.util.DateTimeUtils.parseDateValue(DateTimeUtils.java:313) ~[h2-1.4.196.jar:1.4.196]
Run Code Online (Sandbox Code Playgroud)

Hol*_*ger 10

您遇到的字符串是序列化对象的十六进制表示形式,可以轻松验证:

ByteArrayInputStream is = new ByteArrayInputStream(new BigInteger(
    "aced00057372000d6a6176612e74696d652e536572955d84ba1b2248b20c00007870770703000007e2060c78", 16)
      .toByteArray());
is.read();
ObjectInputStream ois = new ObjectInputStream(is);
final Object obj = ois.readObject();
System.out.println(obj+" ("+obj.getClass().getName()+')');
Run Code Online (Sandbox Code Playgroud)
2018-06-12 (java.time.LocalDate)
Run Code Online (Sandbox Code Playgroud)

当然,存储一个LocalDate这样的blob并不是真正的DateTime API支持的标志,因为它应该是存储值的最后手段.要么,没有支持,要么没有正确配置.在任何一种情况下,您都必须重新检查环境.

  • 不,SHA提供的哈希值不允许重建原始数据,但如果您有原始数据(通过在机器上对它们进行散列并比较哈希值),则可以对其进行验证.我只能将你问题的具体数据识别为序列化数据,因为我之前已经播种了`aced`标记,这是[`ObjectStreamConstants.STREAM_MAGIC`]的十六进制表示(https://docs.oracle.com/ JavaSE的/ 9 /文档/ API /恒定values.html#java.io.ObjectStreamConstants.STREAM_MAGIC)... (4认同)
  • 感谢信息holger.并供将来参考:添加hibernate-java8.jar依赖项后,错误得到了解决.所以,这是框架的一个问题. (2认同)