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

时间:2015-04-15 09:14:46

标签: java hibernate sqlite date datetime

我正在使用Hibernate 4.3.8和SQLite数据库(sqlite-jdbc-3.8.7.jar)。一些映射对象包含Calendar - 属性,例如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")

也是如此

1 个答案:

答案 0 :(得分:0)

经过一番研究,我找到了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实现,如上面的链接所述。