gpt4 book ai didi

java - 使用 SQLite 时,Hibernate 将 Calendar 存储为 int

转载 作者:行者123 更新时间:2023-12-02 07:59:22 26 4
gpt4 key购买 nike

我正在使用 Hibernate 4.3.8 和 SQLite 数据库 (sqlite-jdbc-3.8.7.jar)。一些映射对象包含日历属性,例如开始日期结束日期。 Hibernate 在读取 yyyy-MM-dd 格式的日期时出现问题(例如 2015-01-01)后,我将以下行添加到 hibernate.cfg.xml 中:

<property name="connection.date_string_format">yyyy-MM-dd</property>

现在可以从数据库读取数据,但是当我保存对象时,Hibernate 应该以正确的格式保存日期,但保存自 1970 年以来的毫秒时间。之后,再次从数据库读取会导致错误,因为列现在具有诸如 1427410800105 之类的值,这当然不是正确的格式。顺便说一句,我正在使用 here 中的 SQLiteDialect ,应该没有什么问题。

是否有一些注释可以帮助我?

就我个人而言,我只想更改配置或方言中的一些内容,我不想遍历所有对象并在那里进行更改。当然,我不想将 Calendar 类型更改为 Date,因为这意味着对代码进行太多更改。

更新:使用@Temporal(value = TemporalType.DATE)不起作用。列条目保持不变。

更新2: @Column(columnDefinition = "calendar") 也是如此

最佳答案

经过一番研究,我发现了 CalendarDateType 。据我所知,Hibernate 默认将 Calendar 属性存储为时间戳。 MySQL 似乎将其转换为 DATEDATETIME,但由于 SQLite 没有此类类型,因此所有日期值都存储为 TEXT。将 Calendar 保存为时间戳会导致这些丑陋的数字。 要更改 Hibernate 处理 Calendar 的方式,只需添加 @Type-注释:

@Type(type = "org.hibernate.type.CalendarDateType")
Calendar someAttribute;

如果Calendar应该以其他格式保存,您可以定义自己的UserType实现,就像这个问题一样:Hibernate - Mapping java.util.Calendar to MySQL BIGINT

更新:
我尝试使用 Hibernate 中的 CalendarDateType,但由于某种原因,它不起作用。快速查看源代码还可以发现 Hibernate 使用另一种日期格式 (dd MMMM yyyy),因此可能会出现问题。为了解决这个问题,我编写了自己的 UserType 实现,如上面的链接所述。

关于java - 使用 SQLite 时,Hibernate 将 Calendar 存储为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29646237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com