无法使用MySQL,JPA,Hibernate持久化UTF-8符号

时间:2015-01-22 18:05:18

标签: mysql hibernate jpa querydsl

有很多类比问题,但没有解决我的问题。 我使用JPA和hibernate,并希望保存UTF-8字符。

我的maven依赖项是:

       <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <version>1.0.0.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.1.1.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.3.6.Final</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.34</version>
        </dependency>

       <dependency>
            <groupId>com.mysema.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
            <version>3.6.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.mysema.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <version>3.6.0</version>
        </dependency>

所以我使用JPA 2.1和QueryDSL 3.6.0。 我的persistance.xml是:

<?xml version="1.0" encoding="UTF-8" ?>
<persistence 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_1_0.xsd" version="1.0">


<persistence-unit name="thePersistenceUnit" transaction-type="RESOURCE_LOCAL">
        <properties>

            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/newsDB?useUnicode=true&amp;characterEncoding=UTF-8"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="root"/>

            <!--Hibernate properties-->
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.format_sql" value="false"/>
            <property name="hibernate.hbm2ddl.auto" value="create"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>

        </properties>
    </persistence-unit>
</persistence>

然后我使用XAMPP MySQL和Apache enter image description here enter image description here

并添加

port= 3306
[client]
default-character-set = utf8

[mysqld]
init-connect='SET NAMES utf8'
character-set-server = utf8
collation-server = utf8_general_ci

[mysql]
default-character-set = utf8

我的数据库整理是: enter image description here

我的桌子: enter image description here

当我打开记录器时,我看到了:

TRACE [main] (BasicBinder.java:81) - binding parameter [1] as [VARCHAR] - [Xelian]
TRACE [main] (BasicBinder.java:81) - binding parameter [2] as [VARCHAR] - [Описание]
TRACE [main] (BasicBinder.java:81) - binding parameter [3] as [CLOB] - [Content of the text .Чирипаха.]
TRACE [main] (BasicBinder.java:81) - binding parameter [4] as [BIGINT] - [112]
TRACE [main] (BasicBinder.java:81) - binding parameter [5] as [TIMESTAMP] - [Thu Jan 22 19:44:59 EET 2015]
TRACE [main] (BasicBinder.java:81) - binding parameter [6] as [VARCHAR] - [Title]
TRACE [main] (BasicBinder.java:81) - binding parameter [7] as [TIMESTAMP] - [Thu Jan 22 19:44:59 EET 2015]
TRACE [main] (BasicBinder.java:81) - binding parameter [8] as [BIGINT] - [0]

您可以看到值很奇怪ЧирипаС...Р°。。并通过 phpmyadmin 我看到: enter image description here

但是当我手动编辑它时 enter image description here

你可以看到我的数据库正确地显示了Cyrilic sumbols。所以我想知道问题出在哪里。

2 个答案:

答案 0 :(得分:1)

因此。我在我的机器上卸载了XAMPP和一个isntal MySQL服务器。然后运行MySQL命令Line Client:

show variables like "%character%";show variables like "%collation%";

enter image description here

一切似乎都没问题。 utf-8到处都是。然后DB的结果没有正确编码,仍然有奇怪的符号。当我编辑它们时,插入了西里尔字母。所以我怀疑Hibernate persistance.xml。我编辑它并放置:

<?xml version="1.0" encoding="UTF-8" ?>
<persistence 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_1_0.xsd" version="1.0">


<persistence-unit name="thePersistenceUnit" transaction-type="RESOURCE_LOCAL">

    <properties>
        <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/dnesdb?useUnicode=true&amp;characterEncoding=UTF-8" />
        <property name="javax.persistence.jdbc.user" value="root" />
        <property name="javax.persistence.jdbc.password" value="root" />

        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.hbm2ddl.auto" value="update" />

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

现在UTF-8(西里尔文)坚持不懈。

!!!并且不要忘记 BEFORE 创建数据库以设置java属性: 的 -Dfile.encoding = UTF-8 如果创建了表,之后设置了-Dfile.encoding = UTF-8,则问题仍然存在。所以删除表设置java编码属性,然后再次重新创建表。

答案 1 :(得分:1)

我认为您已经解决了这个问题,但我的建议可能对其他用户有用。

我有类似的问题。我试图使用stackoverflow中的许多建议,但无济于事。问题在于我的IDE(Intellij IDEA)中的项目编码。我的项目有windows-1251编码,我的数据库有utf8编码。您需要根据数据库更改项目编码。在Intellij中:设置 - &gt;编辑器 - &gt;文件编码 - &gt;项目编码。