簡體   English   中英

列的值太長 - 錯誤持久化LocalDate

[英]Value too long for column - error persisting LocalDate

我在持久化LocalDate字段時遇到以下錯誤[在列中使用VARCHAR(20)類型]:

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數據啟動器(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]

您遇到的字符串是序列化對象的十六進制表示形式,可以輕松驗證:

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支持的標志,因為這應該是存儲值的最后手段。 要么,沒有支持,要么沒有正確配置。 在任何一種情況下,您都必須重新檢查環境。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM