我想用定义将数据添加到Oracle 11g数据库中的表中。带时间戳和夏令时的休眠和oracle问题
CREATE TABLE FOO_TIME_TEST
(ID NUMBER(20) NOT NULL, TIME TIMESTAMP(6),
CONSTRAINT FOO_TIME_TEST_PK PRIMARY KEY (ID) USING INDEX);
CREATE UNIQUE INDEX "foo_time_test_idx" ON "FOO_TIME_TEST" (TIME)
使用约达时间与下列
@Type(type = "com.foo.PersistentDateTime")
@Column(name = "TIME")
public DateTime getTime() {
return time;
}
映射类中的休眠/ JPA映射PersistentDateTime相关位
public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index) throws SQLException {
if (value == null) {
Hibernate.TIMESTAMP.nullSafeSet(preparedStatement, null, index);
} else {
Hibernate.TIMESTAMP.nullSafeSet(preparedStatement, ((DateTime) value).toDate(), index);
}
}
public int[] sqlTypes() {
return new int[] { Types.TIMESTAMP, };
}
和写入是这样的,它是在代码一个使用plusTime()的循环,但我把它隔离到这两个调用中。
{
DateTime time = new DateTime(2012, 10, 28, 0, 0, DateTimeZone.UTC);
FooTest data = new FooTest();
data.setTime(time);
em.persist(data);
System.out.println(time + " " + time.getMillis()/1000/60/60);
}
{
DateTime time = new DateTime(2012, 10, 28, 1, 0, DateTimeZone.UTC);
FooTest data = new FooTest();
data.setTime(time);
em.persist(data);
System.out.println(time + " " + time.getMillis()/1000/60/60);
}
输出
2012-10-28T00:00:00.000Z 375384
2012-10-28T01:00:00.000Z 375385
19:23:42,081 WARN JDBCExceptionReporter:100 - SQL Error: 1, SQLState: 23000
19:23:42,081 ERROR JDBCExceptionReporter:101 - ORA-00001: unique constraint (Foo.foo_time_test_idx) violated
我试图消除唯一索引,代码将成功,但在数据库中的两行则是相同的:
ID Time
1 28-OCT-12 01.00.00.000000000 AM
2 28-OCT-12 01.00.00.000000000 AM
与Hibernate跟踪启用后,它似乎显示两个不同的日期正被展平为相同的值。
Hibernate: insert into FOO_TIME_TEST (ID, TIME) values (?, ?)
07:38:54,217 TRACE TimestampType:151 - binding '2012-10-28 01:00:00' to parameter: 22
Hibernate: insert into FOO_TIME_TEST (ID, TIME) values (?, ?)
07:38:54,217 TRACE TimestampType:151 - binding '2012-10-28 01:00:00' to parameter: 22
真正需要的源ojdbc-6.jar可通过下载ojdbc6_g.jar的11.2.0.2.0并把在类路径沿着进一步调试......
我已经启用更多的调试所述-Doracle.jdbc.Trace = true选项的建议here和定制的Java util的log.properties
这提供每个结合呼叫后的附加信息,在这两种情况下的01:00值被示出。
Nov 2, 2012 8:20:21 AM oracle.jdbc.driver.OraclePreparedStatementWrapper setTimestamp
TRACE_30: 3C322E7D Enter: 22, 2012-10-28 01:00:00.0
Nov 2, 2012 8:20:21 AM oracle.jdbc.driver.OraclePreparedStatement setTimestamp
FINE: 3C322E7D Public Enter: 22, 2012-10-28 01:00:00.0
Nov 2, 2012 8:20:21 AM oracle.jdbc.driver.OraclePreparedStatement setTimestampInternal
FINER: 3C322E7D Enter: 22, 2012-10-28 01:00:00.0
如果它仍然是实际的:)请问您可以展示您的FooTime课程内容吗?也许你已经解决了这个问题? –