java - 列的值太长 - 错误持续存在 LocalDate

标签 java hibernate date java-8

我在保留 LocalDate 字段时收到以下错误 [Using VARCHAR(20) type in column]:

Value too long for column "BIRTH_DATE VARCHAR(20)":"'aced00057372000d6a6176612e74696d652e536572955d84ba1b2248b20c00007870770703000007e2060c78' (88)";

字段定义如下:

@Column(name = "BIRTH_DATE")
private LocalDate date;
@Column(name = "BIRTH_TIME")
private LocalTime time;

我正在使用 spring data starter (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() 之前的调试屏幕截图 enter image description here

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

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

最佳答案

您遇到的字符串是序列化对象的十六进制表示,可以很容易地验证:

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()+')');
2018-06-12 (java.time.LocalDate)

当然,将 LocalDate 存储为这样的 blob 并不是真正支持 DateTime API 的标志,因为这应该是存储值的最后手段。要么没有支持,要么没有正确配置。无论哪种情况,您都必须重新检查环境。

关于java - 列的值太长 - 错误持续存在 LocalDate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50840686/

相关文章:

java - 重新启动 Java 游戏

java - event.getX 与圆的 getLayoutX 不对应

java - 为什么我的 SwingWorker 不工作?

php - 从 php 向 mysql 插入日期

php - 将 DateTime 转换为 Date Doctrine php

java - 获取 com.android.volley.ServerError

java - 有没有办法在 hibernate 中选择性地将记录加载到惰性集合中?

java - 如何使用复合键映射多对多

java - 在hibernate中保存值类型集合

java - 字符串中的日期到日期中的日期转换