`
iuottp
  • 浏览: 171424 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

Hibernate與MySQL開發中亂碼解決方案

    博客分类:
  • JAVA
阅读更多

Hibernate與MySQL開發中亂碼解決方案

Hibernate與MySQL開發中亂碼解決方案

文章分类:Java编程 关键字: hibernate與mysql開發中亂碼解決方案

本文參考自:http://blog.tremend.ro/2007/08/14/how-to-set-the-default-charset-to-utf-8-for-create-table-when-using-hibernate-with-java-persistence-annotations/,感謝提供者spostelnicu.

問題:hibernate與mysql開發中,新增和修改時出現中文亂碼
解決:
步驟一:將hibernate.cfg.xml中的connection.url值加入characterEncoding=utf8,具體如下: 

文件:hibernate.cfg.xml內容
Xml代码 复制代码
  1. <!DOCTYPE hibernate-configuration PUBLIC   
  2.     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"   
  3.     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  4.   
  5.   
  6. <hibernate-configuration>  
  7.   <session-factory>  
  8.     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first?characterEncoding=utf8</property>  
  9.     ...   
  10.     
  11.   <session-factory>  
  12. <hibernate-configuration>  
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">


<hibernate-configuration>
  <session-factory>
	<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first?characterEncoding=utf8</property>
	...
 
  <session-factory>
<hibernate-configuration>


步驟二:在建表時,一定要將MySQL中的資料表格的欄位字符集設置成utf8的 ,否則會拋出類似如下錯誤:
錯誤訊息:com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'name' at row 1;

如果是在外部建表,建表語句寫法如下:

Sql代码 复制代码
  1.          create table `my_table` (   
  2.     `Id` int(11) NOT NULL auto_increment,   
  3.     `my_column` mediumtext NOT NULL default ”,   
  4.     ......   
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;   
  6.           
          create table `my_table` (
		`Id` int(11) NOT NULL auto_increment,
		`my_column` mediumtext NOT NULL default ”,
		......
	) ENGINE=InnoDB DEFAULT CHARSET=utf8;
         



另外, hibernate的ORM機制允許我們選建實體,再建表,可以通過hibernate內部的hbm2ddl將實體類直接導出成關系表,可以寫一個
hbm2ddl操作類,如下:
java文件:ExportDB.java

Java代码 复制代码
  1. package com.jason.hibernate;   
  2.   
  3.     import org.hibernate.cfg.Configuration;   
  4.     import org.hibernate.tool.hbm2ddl.SchemaExport;   
  5.   
  6.     public class ExportDB {   
  7.   
  8.         /**  
  9.          * 執行本程式將會建立資料庫表格  
  10.          * @param args  
  11.          */  
  12.         public static void main(String[] args)  {   
  13.             // TODO Auto-generated method stub   
  14.   
  15.             /**  
  16.              * 讀取hibernate配置文件  
  17.              * 加上.configure()會去讀取hibernate.hbm.xml文件,如果沒有設定.  
  18.              * 則會默認讀取hibernate.properties  
  19.              */  
  20.              Configuration cfg = new Configuration().configure();   
  21.                         
  22.              //讀取配置檔,讀取User.hbm.xml成ddl   
  23.              SchemaExport export = new SchemaExport(cfg);           
  24.             //生成實體表   
  25.              export.create(truetrue);   
  26.         }   
  27.     }   
	package com.jason.hibernate;

		import org.hibernate.cfg.Configuration;
		import org.hibernate.tool.hbm2ddl.SchemaExport;

		public class ExportDB {

			/**
			 * 執行本程式將會建立資料庫表格
			 * @param args
			 */
			public static void main(String[] args)  {
				// TODO Auto-generated method stub

				/**
				 * 讀取hibernate配置文件
				 * 加上.configure()會去讀取hibernate.hbm.xml文件,如果沒有設定.
				 * 則會默認讀取hibernate.properties
				 */
				 Configuration cfg = new Configuration().configure();
						 
				 //讀取配置檔,讀取User.hbm.xml成ddl
				 SchemaExport export = new SchemaExport(cfg);		 
				//生成實體表
				 export.create(true, true);
			}
		} 



此時,需要額外對hibernate.cfg.xml進行設定, 先寫一個客戶方言類CustomerMySQLDialect.java,
重載MySQLDialect的getTableTypeString()方法,實現對生成的表格進行字符集設定

文件: CustomerMySQLDialect.java

Java代码 复制代码
  1. package com.jason.hibernate;   
  2.   
  3.     import org.hibernate.dialect.MySQLDialect;   
  4.   
  5.     public class CustomerMySQLDialect extends MySQLDialect {   
  6.   
  7.         /**  
  8.          * 重載getTableTypeString()方法  
  9.          */  
  10.         public String getTableTypeString()   
  11.         {   
  12.             return " ENGINE=InnoDB DEFAULT CHARSET=utf8";          
  13.         }   
  14.     }  
package com.jason.hibernate;

	import org.hibernate.dialect.MySQLDialect;

	public class CustomerMySQLDialect extends MySQLDialect {

		/**
		 * 重載getTableTypeString()方法
		 */
		public String getTableTypeString()
		{
			return " ENGINE=InnoDB DEFAULT CHARSET=utf8";		
		}
	}



之後,將hibernate的方言映身到該文件:
文件: hibernate.cfg.xml

Xml代码 复制代码
  1. <!DOCTYPE hibernate-configuration PUBLIC   
  2.         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"   
  3.         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  4.   
  5.   
  6.     <hibernate-configuration>  
  7.       <session-factory>  
  8.         ...   
  9.         <property name="hibernate.dialect">com.jason.hibernate.CustomerMySQLDialect</property>  
  10.         ...   
  11.         
  12.       <session-factory>  
  13.     <hibernate-configuration>  
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">


	<hibernate-configuration>
	  <session-factory>
		...
		<property name="hibernate.dialect">com.jason.hibernate.CustomerMySQLDialect</property>
		...
	 
	  <session-factory>
	<hibernate-configuration>



這樣就一切OK了,其它的方法沒試過,不過這個我運行過是ok的.
另外說明: 在網上有一些提供以下的方法,不過經過我的驗證,這種方法是不行的,因為Hibernate3中好像沒有hibernate.connection.charSet屬性:
文件: hibernate.cfg.xml

Xml代码 复制代码
  1. <!DOCTYPE hibernate-configuration PUBLIC   
  2.         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"   
  3.         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  4.   
  5.   
  6. <hibernate-configuration>  
  7.   <session-factory>  
  8.     ...   
  9.     <property name="hibernate.connection.charSet">utf8(或utf-8)</property>  
  10.     ...   
  11.     
  12.   <session-factory>  
  13. <hibernate-configuration>  
分享到:
评论

相关推荐

    hibernate+mysql乱码问题

    本文将深入探讨“hibernate+mysql乱码问题”的原因、解决方案以及如何预防这类问题。 首先,我们需要了解乱码问题的根源。在数据库层面,MySQL的编码格式对数据存储和检索至关重要。如果数据库、表或列的字符集不...

    Hibernate_MySQL中文乱码问题.doc

    ### Hibernate与MySQL中文乱码问题解析及解决方案 #### 一、问题概述 在使用Hibernate框架进行Java应用程序开发的过程中,尤其是在连接MySQL数据库时,经常会遇到中文显示乱码的问题。这一问题通常发生在从数据库...

    mysql+jsp+SSH网站开发中文乱码解决方案

    通过以上步骤,可以基本解决MySQL、JSP和SSH框架集成网站开发中的中文乱码问题。在实际开发过程中,要根据项目的具体情况进行调整和测试,确保每个环节都正确处理了字符编码。如果你遇到了特定的问题,可以进一步...

    mysql+jsp+SSH网站开发中文乱码解决方案.doc

    在MySQL、JSP和SSH框架集成的网站开发过程中,中文乱码问题是一个常见的困扰。解决这个问题的关键在于确保整个系统从数据存储、页面显示到数据传输的编码一致性。以下是一个详细的解决方案: 1. **MySQL编码配置**...

    mysql乱码解决方案

    linux 系统下mysql中文乱码问题的解决方案 1、在命令行中输入alter database 数据库名 default character set utf8; 设置字符编码方式 2、 set names utf8; 设置显示方式 3 、jdbc中url的路径后跟上?useUnicode=true...

    hibernate的中文问题的解决方案

    ### Hibernate中文问题解决方案 在开发基于Java的应用程序时,Hibernate作为一个强大的对象关系映射(ORM)框架被广泛采用。然而,在处理中文字符时,开发者可能会遇到各种各样的问题,如乱码显示等。本文将详细...

    mysql乱码问题解决

    ### MySQL乱码问题解决方案 在处理数据库操作时,字符集编码问题经常会导致数据展示或存储过程中出现乱码现象。MySQL作为广泛使用的开源关系型数据库管理系统之一,在实际应用中也难免会遇到字符集不匹配导致的数据...

    hibernate数据库中文乱码问题

    #### 解决方案 为了解决Hibernate中文乱码问题,我们需要从以下几个方面入手: 1. **配置文件设置**:确保Hibernate的配置文件(通常是`hibernate.cfg.xml`)中的数据库连接参数正确设置了字符集。例如,可以通过...

    hibernate插入数据库乱码的解决方式

    ### hibernate插入数据库乱码的解决方式 在处理数据库与应用程序之间的数据交互时,经常会遇到...此外,还可以参考一些实战经验分享,比如常建功老师的视频教程,这些资料对于理解问题根源及解决方案具有很大的帮助。

    SSH下mysql中文乱码问题.docx

    SSH 下 MySQL 中文乱码问题解决方案 在使用 SSH 连接 MySQL 数据库时,可能会出现中文乱码问题,这是因为 MySQL 的默认编码方式不是 UTF-8 导致的。解决这个问题需要从多方面入手,包括配置 Hibernate 的连接参数、...

    sshz中文乱码解决方法

    ### SSH中文乱码解决方法 在开发过程中,经常会遇到字符编码的问题,特别是在处理中文字符时。本文主要介绍如何解决SSH框架中的中文乱码问题。针对不同的应用场景,我们可以通过以下几种方式来解决: #### 1. 强制...

    乱码处理操作类

    这个类可能会覆盖上述的一些关键步骤,或者提供更便捷的解决方案来统一处理乱码问题。 总的来说,乱码处理是Web开发中的重要环节,涉及到多个层次的编码设置。正确理解和应用这些知识点,可以有效地避免乱码问题,...

    Hibernatetools编码格式的问题

    在提供的压缩包文件“hibernatetools”中,可能包含了一些示例代码、配置文件或日志,通过分析这些内容,可以更深入地理解问题的根源,并找到解决方案。不过,由于具体的文件内容未知,这里只能提供一般性的解决策略...

    s2shmysql乱码问题

    ### s2sh与MySQL乱码问题解析 #### 一、问题背景 在使用Struts2+Spring+Hibernate(简称S2SH)框架结合MySQL数据库进行Web应用开发的过程中,经常会出现字符编码不一致导致的乱码问题。这类问题不仅影响用户体验,...

    《MyEclipse 6 Java 开发中文教程》前10章

    Tomcat JSP Web 开发中的乱码问题小结 164 第九章 开发Struts 1.x应用 166 9.1 介绍 166 9.2 创建Struts项目 168 9.2.1 创建Web项目 169 9.2.2 加入 Struts开发功能 169 9.3 使用Struts工具 171 9.3.1 Struts配置...

    java开发框架[文].pdf

    SSH框架结合了Struts2、Spring和Hibernate,提供了更全面的解决方案。在SSH框架中,除了上述步骤外,还需配置Spring以管理依赖和事务,以及Hibernate来处理ORM(对象关系映射)。首先,配置数据库连接,例如MySQL,...

    ssh(structs,spring,hibernate)框架中的上传下载

     以上是Spring+Hibernate将文件二进制数据持久化到数据库的解决方案,而Struts通过将表单中file类型的组件映射为ActionForm中类型为org.apache.struts.upload. FormFile的属性来获取表单提交的文件数据。  工程...

    关于乱码问题简单分析

    本文将对JSP中的乱码问题进行详细的分析,并提供一系列解决方案。 #### 二、乱码产生的原因 在探讨解决办法之前,我们需要了解导致JSP乱码的原因。通常来说,乱码主要由以下几个方面引起: 1. **页面编码设置不...

    [1223][MYSQL完全手册][16M]

    MySQL支持多种操作系统,并且拥有强大的社区支持,使其成为许多开发者和企业的首选数据库解决方案。 #### 2. MySQL特点 - **开源免费**:MySQL是基于GPL协议发布的开源软件,用户可以自由地下载、使用和修改源代码...

    Eclipse创建的JSP文件链接SQLServer2012,Oracle,mysql的方法.rar

    本教程主要介绍如何在Eclipse环境中,使用JSP文件链接SQLServer2012、Oracle和MySQL这三种常见的关系型数据库,提供详细的操作步骤和可能遇到的问题解决方案。 首先,让我们了解Eclipse。Eclipse是一款开源的集成...

Global site tag (gtag.js) - Google Analytics