JPA和sqlite3的 -
问题描述:
在我的实体类的一个日期字段定义如下错误日期:JPA和sqlite3的 -
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "LAST_EXECUTED")
private Date lastExecuted = new Date();
然而,当它是通过JPA持久化到sqlite3的数据库,该数据库值始终是“1899年至1812年-30' 。你有什么想法为什么?
在数据库中,该字段被定义为DATETIME
。
我试过使用SqliteJDBC和Xerial SQLite JDBC。
更新:中的EclipseLink JPA打开SQL调试,并关闭参数结合后,它看起来像日期插入如下:
insert into run (last_executed) values ('{ts ''2012-02-17 10:34:58.013''}');
,如果插入,手动SQLite中,给出了日期'1899-12-30'。
当然,任何解决方法将不胜感激。
答
日期看起来在插入正确,所以似乎是某种SQLite问题。您通常应该使用参数绑定,看起来SQLite确实允许绑定时间戳,或者忽略DATE部分。如果使用TemporalType.DATE会怎么样?
也许尝试通过原始JDBC来查看您的JDBC驱动程序问题究竟是什么?
对于打印的语法,如果不使用参数绑定,您可以通过创建您自己的DatabasePlatform子类来自定义它。您打印的语法是标准的JDBC时间戳语法。
答
您可以验证它是java.util.Date而不是java.sql.Date吗?
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "LAST_EXECUTED")
private java.util.Date lastExecuted = new Date();
如果重新打开参数绑定,调试输出的外观如何?
答
使用smalldatetime解决问题~~~试试吧。
很明显,您正在使用JPA的特定实现,并且每个JPA实现都会给出不同的结果。因此,实际上提及哪些JPA实施将是一种帮助;-) – DataNucleus 2012-02-17 08:20:35
对不起;它是EclipseLink JPA。 – Dario 2012-02-17 09:37:46
无法帮助您,因为DataNucleus JPA会执行INSERT作为“INSERT INTO A(LAST_EXECUTED)VALUES('2012-02-17 13:41:09.453')”,并且在检索时存在持续存在的所有数据 – DataNucleus 2012-02-17 13:43:28