我正在使用Hibernate 4.3.8和SQLite数据库(sqlite-jdbc-3.8.7.jar)。一些映射对象包含Calendar
- 属性,例如startDate
和endDate
。在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")
答案 0 :(得分:0)
经过一番研究,我找到了CalendarDateType。正如我所看到的,Hibernate默认将要更改Hibernate处理Calendar
属性存储为时间戳。 MySQL似乎将其转换为DATE
或DATETIME
,但由于SQLite没有此类型,因此所有日期值都存储为TEXT
。将Calendar
保存为时间戳会导致这些丑陋的数字。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
实现,如上面的链接所述。