JPA和sqlite3的 -

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'。

当然,任何解决方法将不胜感激。

+0

很明显,您正在使用JPA的特定实现,并且每个JPA实现都会给出不同的结果。因此,实际上提及哪些JPA实施将是一种帮助;-) – DataNucleus 2012-02-17 08:20:35

+0

对不起;它是EclipseLink JPA。 – Dario 2012-02-17 09:37:46

+0

无法帮助您,因为DataNucleus JPA会执行INSERT作为“INSERT INTO A(LAST_EXECUTED)VALUES('2012-02-17 13:41:09.453')”,并且在检索时存在持续存在的所有数据 – DataNucleus 2012-02-17 13:43:28

日期看起来在插入正确,所以似乎是某种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解决问题~~~试试吧。