2012-11-02 12 views
5

के साथ हाइबरनेट और ऑरैकल समस्याएं मैं परिभाषा के साथ एक ऑरैकल 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 
+0

यदि यह अभी भी वास्तविक है :) क्या आप कृपया अपनी FooTime क्लास सामग्री दिखा सकते हैं? शायद आप पहले से ही उस मुद्दे को हल कर चुके हैं? –

उत्तर

0

आप समय क्षेत्र के साथ समय भंडारण कर रहे हैं जैसा कि मैंने प्रकार TIMESTAMP (3) समय क्षेत्र के साथ उपयोग करने का सुझाव होगा।

CREATE TABLE TIME_TABLE 
(
    YOUR_TIME TIMESTAMP(3) WITH TIME ZONE, 
    TIME_ZONE VARCHAR (64 BYTE), 
) 

हाइबरनेट मानचित्रण उपयोग Joda वर्ग org.joda.time.contrib.hibernate.PersistentDateTimeTZ के लिए, नीचे एक्सएमएल मानचित्रण का टुकड़ा है।

<property name="yourTime" type="org.joda.time.contrib.hibernate.PersistentDateTimeTZ"> 
    <column name="YOUR_TIME" /> 
    <column name="TIME_ZONE" /> 
</property> 

मैं एनोटेशन आधारित हाइबरनेट मानचित्रण से परिचित नहीं हूँ, लेकिन मुझे लगता है ऐसा लगता है जैसे (मैं इसे करने की कोशिश नहीं की है) कुछ ऐसा दिखाई देगा:

@Type(type = "org.joda.time.contrib.hibernate.PersistentDateTimeTZ") 
@Columns(columns = { @Column(name = "YOUR_TIME"), @Column(name = "TIME_ZONE") }) 
public DateTime getYourTime() { 
     return yourTime; 
} 

मुझे आशा है कि इस मदद करता है।

पीएस मैं जोडा डेटटाइम कन्स्ट्रक्टर का उपयोग कर रहा हूं उसे पहचान नहीं रहा: इसमें सेकेंड और मिलीसेकंड तर्क नहीं हैं।

संबंधित मुद्दे