2012-04-09 14 views
10

मैं org.jadira.usertype:usertype.jodatime:1.9 का उपयोग करके जोडाटाइम DateTime फ़ील्ड timestamptz कॉलम संग्रहीत कर रहा हूं। ऐप सर्वर में +4 समय क्षेत्र है। डीबी सर्वर +9 समय क्षेत्र। new DateTime() परिणाम ${currentTime+1hour}+9 जहां +9 समय क्षेत्र है (सही मान ${currentTime+5hours)+9 है)।जोडा समय डेटटाइम डेटाबेस में गलत तरीके से स्टोर करता है

मुझे कोई संबंधित विषय नहीं मिला है। java.util.Date सही ढंग से स्टोर करता है।

static mapping = { 
    dateCreated sqlType:'timestamptz' 
} 

मैं कैसे दिनांक समय सही ढंग से स्टोर कर सकते हैं:

डोमेन वस्तु निम्नलिखित मानचित्रण संपत्ति है?

उत्तर

4

ठीक है। मैंने समस्या को हल करने के लिए 8 घंटे बिताए हैं। यदि आप जोडाटाइम को जारी रखने के लिए usertype प्रोजेक्ट का उपयोग कर रहे हैं, तो आपको databaseZonePersistentDateTime क्लास की वर्तमान सेट सर्वर टाइमज़ोन (डेटाबेस नहीं!) के बराबर सेट करना होगा।

लेकिन official hibernate support का उपयोग करना बेहतर है। यह बॉक्स से बाहर समस्या का हल है क्योंकि यह java.utl.Date का उपयोग करता DateTime और java.util.Date सही ढंग से डिफ़ॉल्ट

+9

आधिकारिक हाइबरनेट समर्थन हाइबरनेट 4.0 तक विस्तारित नहीं होता है। :-(जिसके लिए आप प्रयोक्ता प्रकार प्रयोग करना होगा। –

0

-Duser.timezone = UTC से JAVA_OPTS के साथ JVM प्रारंभ करने का प्रयास करें, जिस तरह से समय एक क्षेत्र में है और फिर आप इसे अपने परिचालन में तब तक परिवर्तित कर सकते हैं जहां आप हैं।

+0

जाने के लिए एक शानदार तरीका है कि - लेकिन चेतावनी दी है कि आप ऐसा नहीं कर सकते कि आप पहले से ही डीबी में किसी अन्य समय क्षेत्र में संग्रहीत दिनांक है। दूसरे शब्दों में, नई परियोजनाओं के लिए कोई समस्या नहीं है लेकिन मौजूदा डेटा वाले लोगों के लिए ऐसा करने से बहुत सावधान रहें। – RedYeti

0

Fedor द्वारा कायम रहने की,

मैं सही आप समय क्षेत्र स्तंभ के साथ Oracle TIMESTAMP उपयोग कर रहे हैं ग्रहण करने के लिए है? जेडबीसी डेटाबेस के बीच भिन्न होने के कारण हैंडलिंग के कारण यूजरटाइप अभी तक इस प्रकार का समर्थन नहीं करता है (यानी समय क्षेत्र के साथ), हालांकि परियोजना पैच स्वीकार करने में प्रसन्न होगी।

वहाँ कुछ अच्छी चर्चा wrt ओरेकल यहाँ है: http://puretech.paawak.com/2010/11/02/how-to-handle-oracle-timestamp-with-timezone-from-java/

+0

हम PostgreSQL timestamptz –

0

मैं अन्य PersistentDateTime बनाकर समस्याओं का समाधान किया था AbstractVersionableUserType फैली हुई है।

import java.sql.Timestamp; 

import org.hibernate.SessionFactory; 
import org.hibernate.usertype.ParameterizedType; 
import org.jadira.usertype.dateandtime.joda.columnmapper.TimestampColumnDateTimeMapper; 
import org.jadira.usertype.spi.shared.AbstractVersionableUserType; 
import org.jadira.usertype.spi.shared.IntegratorConfiguredType; 
import org.joda.time.DateTime; 

public class PersistentDateTime extends AbstractVersionableUserType<DateTime, Timestamp, TimestampColumnDateTimeMapper> implements ParameterizedType, IntegratorConfiguredType { 

@Override 
public int compare(Object o1, Object o2) { 
    return ((DateTime) o1).compareTo((DateTime) o2); 
} 

@Override 
public void applyConfiguration(SessionFactory sessionFactory) { 

    super.applyConfiguration(sessionFactory); 

    TimestampColumnDateTimeMapper columnMapper = (TimestampColumnDateTimeMapper) getColumnMapper(); 
    columnMapper.setDatabaseZone(null); 
    columnMapper.setJavaZone(null); 
} 
} 
8

मुझे एक ही समस्या थी। कॉन्फ़िगरेशन में ऐप और डीबी जोनों को निर्दिष्ट करने से समस्या हल हो गई।

  <prop key="jadira.usertype.autoRegisterUserTypes">true</prop> 
      <prop key="jadira.usertype.databaseZone">America/Los_Angeles</prop> 
      <prop key="jadira.usertype.javaZone">America/Los_Angeles</prop> 
+1

हाइबरनेट 4+ – Sudarshan

+1

के लिए यह एक काम करता है का उपयोग कर रहे हैं फ़ाइल है? – dgrant

9

बस सेट जेपीए गुण:

<property name="jadira.usertype.autoRegisterUserTypes" 
      value="true"/> 
<property name="jadira.usertype.databaseZone" 
      value="jvm"/> 
<property name="jadira.usertype.javaZone" 
      value="jvm"/> 
+1

में जाना है क्या फ़ाइल है? – dgrant

+0

@dgrant में जाता है अपने persistence.xml फ़ाइल में – Hamish

+0

क्या कोई XML फ़ाइल के बिना ऐसा करने का कोई तरीका है? मेरा प्रोजेक्ट अब तक कॉन्फ़िगरेशन के लिए शुद्ध एनोटेशन का उपयोग कर रहा है ... – Jules

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