2012-01-23 32 views
9

Estoy usando import.sql para escribir mis datos de desarrollo en DB. Estoy usando MySQL Server 5.5 y mi persistence.xml está aquí:Hibernate/JPA caracteres import.sql utf8 dañados

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

Algunos caracteres en mi import.sql no se muestra correctamente en el PP. Por ejemplo, el carácter ü se convierte en ü en db. Conjunto de caracteres predeterminado en MySQL es UTF-8 y yo soy la creación de tablas como

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; 

Es raro que si importar el uso de datos de MySQL gerente de importación/exportación es correcta, pero utilizando hibernate.hbm2ddl.auto = crear personajes corruptos hace .

¿Cómo puedo solucionar esto?

Editar: También he intentado añadir

<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. Pero no ayudó.

Fix: Lo he resuelto con el tiempo. Estoy usando Tomcat y ese es el punto de la corrupción no hibernate o mysql. Lo comencé con el comando JAVA_OPTS = -Dfile.encoding = UTF-8 y mi problema desaparece.

El título de la pregunta se volvió engañoso ahora. Lo siento por eso.

Respuesta

10

Al crear el lector para ese archivo, Hibernate usa new InputStreamReader(stream); directamente, sin codificación explícita (se asume/usa la codificación del conjunto de caracteres de la plataforma de ejecución predeterminada).

tanto, en otras palabras, su archivo import.sql debe estar en el valor por defecto de ejecución plataforma de codificación charset.

Hay un viejo (2006!) Tema abierto para esto, en caso de que se quiere enviar un parche: https://hibernate.atlassian.net/browse/HBX-711


opciones para corregir:

  • Añadir -Dfile.encoding=UTF-8 a la JAVA_OPTS variable de entorno, como:

    # 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 
    
  • Establezca una propiedad en su plugin Maven (podría ser surefire, failsafe u otro, dependiendo de cómo ejecute el código que importa el archivo de hibernación). Ejemplo de surefire:

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

+1 por el motivo correcto, sin embargo, la suposición no es correcta, porque entonces sus pruebas dependerían de la plataforma. La solución más simple es establecer la codificación del archivo de texto para 'UTF-8' en su IDE o' -Dfile.encoding = UTF8 'si usa maven como @Jaroslav Frolikov ya indicado. –

+0

Todavía no funciona en 2017 – gstackoverflow

2

Aquí hay una solución confiable sin establecer ninguna propiedad del sistema.

Suponemos que los archivos de importación están codificados con UTF-8 pero el juego de caracteres predeterminado de Java es diferente, digamos latin1.

1) Definir una clase personalizada para import_files_sql_extractor hibernate.hbm2ddl.import_files_sql_extractor = com.pragmasphere.hibernate.CustomSqlExtractor

2) fijar las cadenas no válidas leídos por hibernación en la implementación.

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

Puede cambiar el valor de SOURCE_CHARSET con otro sistema de codificación utilizado por los archivos de importación.

Cuestiones relacionadas