【问题标题】:Hibernate stores Calendar as int when using SQLite使用 SQLite 时,Hibernate 将 Calendar 存储为 int
【发布时间】:2015-06-21 04:16:57
【问题描述】:

我正在使用 Hibernate 4.3.8 和 SQLite 数据库 (sqlite-jdbc-3.8.7.jar)。一些映射对象包含Calendar-attributes,例如startDateendDate。在 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) 不起作用。列条目保持不变。

UPDATE2:@Column(columnDefinition = "calendar")也是如此

【问题讨论】:

    标签: java hibernate sqlite date datetime


    【解决方案1】:

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

    @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 实现,如上面的链接所述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      相关资源
      最近更新 更多