2015-11-30 8 views
9

मेरे पास एक चल रहा ऐप वसंत बूट 1.3 + हाइबरनेट 5 + जावा 8 + ज़ोनडडेट टाइम + पोस्टग्रेस्क्ल है और तालिकाओं में से एक में मेरे पास निम्न फ़ील्ड हैं।हाइबरनेट 5 + ज़ोनडडेट टाइम + पोस्टग्रेस्क्ल इनलक्यूड टाइम जोन और ऑफ़सेट

@Column(name = "DATE_ENABLED") 
@Type(type="java.time.ZonedDateTime") 
private ZonedDateTime dateEnabled; 

@Column(name = "DATE_DISABLED") 
@Type(type="java.time.ZonedDateTime") 
private ZonedDateTime dateDisabled; 

मैं तो अनुप्रयोग चलाने तो मैं देखता हूँ कि यह डिफ़ॉल्ट रूप से पैदा करता है "टाइमस्टैम्प समय क्षेत्र के बिना"

testDB=# \d type 
       Table "public.type" 
      Column    |   Type    | Modifiers 
--------------------------------+-----------------------------+----------- 
type_id      | bytea      | not null 
date_disabled     | timestamp without time zone | 
date_enabled     | timestamp without time zone | 

मुझे पता है कि अगर मैं करने के लिए "समय क्षेत्र के साथ TIMESTAMP" columnDefinition = जोड़ने

@Column(name = "DATE_DISABLED", columnDefinition= "TIMESTAMP WITH TIME ZONE") 

तरह स्तंभ यानी कुछ तो इसे सही ढंग से काम करता है और मैं यह देखने के लिए कि हाइबरनेट समय क्षेत्र के साथ एक स्तंभ बनाया सक्षम हूँ, लेकिन अगर मैं इस बात को समझ सही ढंग से यह केवल postgre के लिए काम किया जाएगा यानी अगर मैं कल डेटाबेस को mysql में बदलता हूं तो हाइबरनेट एक त्रुटि फेंक देगा।

इस प्रकार मेरा प्रश्न यह है कि सामान्य रूप से ऐसा करने के लिए कैसे एक कॉलम बनाने के लिए हाइबरनेट को बताने के लिए जिसमें समय क्षेत्र और ऑफसेट शामिल होना चाहिए। मेरी राय थी कि जब जावा प्रकार "ज़ोनडडेट टाइम" को समय क्षेत्र और यूटीसी में समय ऑफसेट शामिल करने के लिए डिलीबेरेटली बनाया गया है, तो हाइबरनेट डिफ़ॉल्ट रूप से एक कॉलम बना देगा जिसमें समय क्षेत्र शामिल होगा। इस प्रकार सवाल फिर से समय क्षेत्र और ऑफसेट को शामिल करने के लिए हाइबरनेट को बताने का उचित तरीका क्या है।

यहाँ मेरी पोम

<groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.3.0.RELEASE</version> 

    <hibernate.version>5.0.4.Final</hibernate.version> 

    <dependency> 
     <groupId>org.postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
    </dependency> 

    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-java8</artifactId> 
     <version>${hibernate.version}</version> 
    </dependency> 

और मेरे गुण के हिस्से हैं बोली

@Bean 
    public Properties hibernateProperties() { 
     return new Properties() { 
     { 
      setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect"); 
      setProperty("hibernate.chach.provider_class", "org.hibernate.cache.NoCacheProvider"); 
      setProperty("hibernate.show_sql", "true");    
      setProperty("hibernate.hbm2ddl.auto", "create-drop"); 
     } 
     }; 
    } 

उत्तर

2

दिखा फ़ाइल ऐसा लगता है इस समस्या को केवल एक बाधा है अगर आप स्कीमा निर्माण के लिए हाइबरनेट का उपयोग करें। इसलिए यदि पोस्टग्रेएसक्यूएल पर timestamp with time zone के रूप में कॉलम बनाने के बाद सब कुछ ठीक से काम करता है, तो बस उसके साथ जाएं। वैसे भी हाइबरनेट को अपनी स्कीमा उत्पन्न करने के लिए यह एक बुरा अभ्यास है। इसे मैन्युअल रूप से करें (या एक डीबीए ऐसा करें)। यदि आप स्वचालित करना चाहते हैं, तो विश्वसनीय व्यक्ति ने एसक्यूएल स्क्रिप्ट लिखे जाने के बाद Flyway या Liquibase जैसे डेटाबेस माइग्रेशन टूल का उपयोग करें।

इसके अलावा, आवश्यकता "कल डेटाबेस को बदलें" वास्तव में काल्पनिक लगता है, कामकाजी डेटाबेस स्वतंत्र है कम या ज्यादा अवास्तविक है और इसे करने के लिए बड़े अनुप्रयोगों को लिखने में कठोर हो जाता है।

यदि आपको हाइबरनेट/जेडीबीसी टाइमस्टैम्प व्यवहार के बारे में अधिक जानकारी चाहिए, तो शायद this nice article about that देखें।