2012-01-23 15 views
9

Sto usando import.sql per scrivere i miei dati di sviluppo su DB. Sto usando MySQL Server 5.5 e la mia persistence.xml è qui:Hibernate/JPA import.sql utf8 caratteri corrotti

<?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> 

Alcuni personaggi nel mio import.sql non viene mostrato correttamente nel DB. Ad esempio, il carattere ü diventa ¼ in db. charset di default in MySQL è utf-8 e io sono tavoli che creano come

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; 

E 'strano che se importare utilizzando i dati di Mysql responsabile import/export è corretto ma utilizzando hibernate.hbm2ddl.auto = creare rende personaggi corrotti .

Come posso risolvere questo?

Edit: Anche io ho provato ad aggiungere

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

a persistence.xml. Ma non ha aiutato.

Correzione: L'ho risolto alla fine. Sto usando Tomcat e questo è il punto di corruzione non ibernato o mysql. L'ho avviato con il comando set JAVA_OPTS = -Dfile.encoding = UTF-8 e il mio problema scompare.

Il titolo di domanda è diventato fuorviante ora. Perdonami per quello.

risposta

10

Durante la creazione del lettore per quel file, Hibernate utilizza direttamente new InputStreamReader(stream);, senza codifica esplicita (viene presupposta/utilizzata la codifica del charset della piattaforma di esecuzione predefinita).

Quindi, in altre parole, il file deve essere import.sql nell'esecuzione codifica piattaforma charset di default .

C'è un vecchio (2006!) Questione aperta per questo, nel caso in cui si voglia inviare un patch: https://hibernate.atlassian.net/browse/HBX-711


Opzioni di correzione:

  • Aggiungere -Dfile.encoding=UTF-8 al JAVA_OPTS variabile di ambiente, ad esempio:

    # 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 
    
  • Impostare una proprietà nel plug-in Maven (potrebbe essere surefire, failsafe o altro, a seconda di come si esegue il codice che importa il file di sospensione). Esempio per surefire:

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

+1 per la ragione corretta, tuttavia l'ipotesi non è corretta, perché i test potrebbero essere dipendenti dalla piattaforma. La soluzione più semplice è impostare la codifica del file di testo su 'UTF-8' nel proprio IDE o' -Dfile.encoding = UTF8 'se si utilizza Maven come @Jaroslav Frolikov ha già affermato. –

+0

Ancora non funziona nel 2017 – gstackoverflow

2

Ecco una soluzione affidabile senza impostare alcuna proprietà di sistema.

Supponiamo che i file di importazione siano codificati con UTF-8 ma il set di caratteri predefinito di Java è diverso, diciamo latin1.

1) Definire una classe personalizzata per import_files_sql_extractor hibernate.hbm2ddl.import_files_sql_extractor = com.pragmasphere.hibernate.CustomSqlExtractor

2) fissare le stringhe non valide letti dal hibernate nella realizzazione.

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; 
    } 
} 

È possibile modificare il valore di SOURCE_CHARSET con un'altra codifica utilizzata dai file di importazione.

Problemi correlati