2012-01-23 12 views
9

मैं डीबी को अपना विकास डेटा लिखने के लिए import.sql का उपयोग कर रहा हूं। मैं MySQL सर्वर 5.5 का उपयोग कर रहा है और मेरे persistence.xml यहाँ है:हाइबरनेट/जेपीए import.sql utf8 वर्ण दूषित

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
<persistence-unit name="MobilHM" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>tr.com.stigma.db.entity.Doctor</class> 
    <class>tr.com.stigma.db.entity.Patient</class> 
    <class>tr.com.stigma.db.entity.Record</class> 
    <class>tr.com.stigma.db.entity.User</class> 
    <properties> 
     <property name="hibernate.hbm2ddl.auto" value="create" /> 
     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.format_sql" value="true" /> 
     <!-- Auto detect annotation model classes --> 
     <property name="hibernate.archive.autodetection" value="class" /> 
     <!-- Datasource --> 
     <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" /> 
     <property name="hibernate.connection.username" value="mobilhm" /> 
     <property name="hibernate.connection.password" value="mobilhm" /> 
     <property name="hibernate.connection.url" value="jdbc:mysql://localhost/mobilhm" /> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> 
    </properties> 
</persistence-unit> 

कुछ वर्ण मेरी import.sql में डीबी में सही ढंग से नहीं दिखाया गया है। उदाहरण के लिए चरित्र ü डीबी में ü हो जाता है। mysql में डिफ़ॉल्ट चारसेट utf-8 है और मैं

CREATE TABLE doctor (doctorId int unsigned NOT NULL AUTO_INCREMENT, name varchar(45) NOT NULL, surname varchar(45) NOT NULL, PRIMARY KEY (doctorId)) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

यह अजीब है कि अगर मैं Mysql आयात/निर्यात प्रबंधक डेटा का उपयोग कर आयात सही लेकिन hibernate.hbm2ddl.auto का उपयोग कर रहा है की तरह बनाने टेबल हूँ = बनाने बनाता भ्रष्ट पात्रों ।

मैं इसे कैसे हल कर सकता हूं?

संपादित करें: इसके अलावा, मैं

<property name="hibernate.connection.useUnicode" value="true" /> 
<property name="hibernate.connection.characterEncoding" 
      value="UTF-8" /> 
<property name="hibernate.connection.charSet" value="UTF-8" /> 

persistence.xml को जोड़ने की कोशिश की है। लेकिन यह मदद नहीं की।

फिक्स: मैंने इसे अंततः हल कर लिया है। मैं टोमकैट का उपयोग कर रहा हूं और यह भ्रष्टाचार का मुद्दा हाइबरनेट या माइस्क्ल नहीं है। मैंने इसे सेट JAVA_OPTS = -Dfile.encoding = UTF-8 कमांड के साथ शुरू कर दिया है और मेरी समस्या दूर हो गई है।

प्रश्न का शीर्षक अब भ्रामक हो गया। उसके लिए खेद है।

उत्तर

10

उस फ़ाइल के लिए पाठक बनाते समय, हाइबरनेट सीधे new InputStreamReader(stream); का उपयोग करता है, स्पष्ट एन्कोडिंग के बिना (डिफ़ॉल्ट निष्पादन प्लेटफ़ॉर्म वर्णसेट एन्कोडिंग ग्रहण/उपयोग किया जाता है)।

तो, दूसरे शब्दों में, अपने import.sql फ़ाइल डिफ़ॉल्ट निष्पादन मंच चारसेट एन्कोडिंग में होनी चाहिए।

एक पुराने (2006!) इस के लिए खुला मुद्दा है, मामले में एक एक पैच भेजना चाहता है: https://hibernate.atlassian.net/browse/HBX-711


विकल्प ठीक करने के लिए:

  • को -Dfile.encoding=UTF-8 जोड़े JAVA_OPTS पर्यावरण चर, जैसे:

    # Linux/Unix 
    export JAVA_OPTS=-Dfile.encoding=UTF-8 
    # Windows 
    set JAVA_OPTS=-Dfile.encoding=UTF-8 
    
    # Attention, check before if your JAVA_OPTS doesnt already have a value. If so, 
    # then it should be 
    export JAVA_OPTS=$JAVA_OPTS -Dfile.encoding=UTF-8 
    # or 
    set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8 
    
  • अपने मेवेन प्लगइन में एक संपत्ति सेट करें (surefire, failsafe या अन्य हो सकता है, इस पर निर्भर करता है कि आप हाइबरनेट फ़ाइल आयात करने वाले कोड को कैसे चलाते हैं)। surefire के लिए उदाहरण:

    <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-surefire-plugin</artifactId> 
        <configuration> 
         <argLine>-Dfile.encoding=UTF8</argLine> 
        </configuration> 
    </plugin> 
    
+2

+1 सही कारण के लिए +1, हालांकि धारणा सही नहीं है, क्योंकि तब आपके परीक्षण मंच-निर्भर होंगे। सबसे आसान समाधान टेक्स्ट आईडी एन्कोडिंग को आपके आईडीई में 'यूटीएफ -8' पर सेट करना है या' -Dfile.encoding = UTF8 'अगर मैवेन का उपयोग @ जारोस्लाव फ्रोलिकोव के रूप में पहले से ही किया गया है। –

+0

यह अभी भी 2017 में काम नहीं करता है – gstackoverflow

2

यहां कोई सिस्टम प्रॉपर्टी सेट किए बिना विश्वसनीय समाधान है।

हम मानते हैं कि आयात फ़ाइलें UTF-8 के साथ एन्कोड की गई हैं लेकिन जावा डिफ़ॉल्ट वर्णसेट अलग है, मान लें latin1

1) के लिए import_files_sql_extractor hibernate.hbm2ddl.import_files_sql_extractor एक कस्टम वर्ग को परिभाषित करें = com.pragmasphere.hibernate.CustomSqlExtractor

2) अमान्य तार कार्यान्वयन में हाइबरनेट द्वारा पढ़ा ठीक।

package com.pragmasphere.hibernate; 

import org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor; 

import java.io.IOError; 
import java.io.Reader; 
import java.io.UnsupportedEncodingException; 
import java.nio.charset.Charset; 

public class CustomSqlExtractor extends MultipleLinesSqlCommandExtractor { 

    private final String SOURCE_CHARSET = "UTF-8"; 

    @Override 
    public String[] extractCommands(final Reader reader) { 
     String[] lines = super.extractCommands(reader); 

     Charset charset = Charset.defaultCharset(); 
     if (!charset.equals(Charset.forName(SOURCE_CHARSET))) { 
      for (int i = 0; i < lines.length; i++) { 
       try { 
        lines[i] = new String(lines[i].getBytes(), SOURCE_CHARSET); 
       } catch (UnsupportedEncodingException e) { 
        throw new IOError(e); 
       } 
      } 
     } 

     return lines; 
    } 
} 

आप आयात फ़ाइलों द्वारा प्रयोग किया एक और एन्कोडिंग के साथ SOURCE_CHARSET का मूल्य बदल सकते हैं।

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