के साथ हाइबरनेट और ऑरैकल समस्याएं मैं परिभाषा के साथ एक ऑरैकल 11 जी डेटाबेस में किसी तालिका में डेटा जोड़ने की कोशिश कर रहा हूं।टाइमस्टैम्प और डेलाइट सेविंग
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;
}
साथ Joda समय का उपयोग कर 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, };
}
और कोड लिखने के लिए इस तरह है, यह में था प्लसटाइम() का उपयोग करके एक लूप लेकिन मैंने इसे इन दो कॉलों में अलग कर दिया।
{
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: 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 के लिए स्रोत की आवश्यकता 11.2.0.2.0 के लिए ojdbc6_g.jar को डाउनलोड करने और साथ-साथ classpath में रख कर आगे डिबग करने के लिए ...
मैं और अधिक डिबग सक्रिय कर दिया है theDoracle.jdbc.Trace = सही विकल्प सुझाए गए here और एक कस्टम जावा उपयोग 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 क्लास सामग्री दिखा सकते हैं? शायद आप पहले से ही उस मुद्दे को हल कर चुके हैं? –