`
iuottp
  • 浏览: 166823 次
  • 性别: 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>  
分享到:
评论

相关推荐

    mysql乱码解决方案

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

    《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配置...

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

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

    JspRun!社区论坛系统 v6.0.0 build 20110516 UTF-8 安装版.zip

    的基础架构采用世界上最先进流行的 web 编程组合 JAVA MySQL 实现,是一个经过完善设计,适用于各种服务器环境的高效论坛系统解决方案。系统采用struts、hibernate框架及中间件的结合既实现了业务逻辑与控制逻辑的...

    JspRun!社区论坛系统 v6.0.0 build 20110516 GBK 安装版.zip

    的基础架构采用世界上最先进流行的 web 编程组合 JAVA MySQL 实现,是一个经过完善设计,适用于各种服务器环境的高效论坛系统解决方案。系统采用struts、hibernate框架及中间件的结合既实现了业务逻辑与控制逻辑的...

    JspRun!社区论坛系统 v6.0.0 build 20110516 UTF-8 源码版.zip

    的基础架构采用世界上最先进流行的 web 编程组合 JAVA MySQL 实现,是一个经过完善设计,适用于各种服务器环境的高效论坛系统解决方案。系统采用struts、hibernate框架及中间件的结合既实现了业务逻辑与控制逻辑的...

    JspRun!社区论坛系统 v6.0.0 build 20110516 GBK 源码版.zip

    的基础架构采用世界上最先进流行的 web 编程组合 JAVA MySQL 实现,是一个经过完善设计,适用于各种服务器环境的高效论坛系统解决方案。系统采用struts、hibernate框架及中间件的结合既实现了业务逻辑与控制逻辑的...

    JspRun!社区论坛系统 v6.0 bulid 090423 GBK 源码版.rar

    的基础架构采用世界上最先进流行的 web 编程组合 JAVA MySQL 实现,是一个经过完善设计,适用于各种服务器环境的高效论坛系统解决方案。系统采用struts、hibernate框架及中间件的结合既实现了业务逻辑与控制逻辑的...

    JspRun!社区论坛系统 v6.0 bulid 090424 GBK 安装版.rar

    的基础架构采用世界上最先进流行的 web 编程组合 JAVA MySQL 实现,是一个经过完善设计,适用于各种服务器环境的高效论坛系统解决方案。系统采用struts、hibernate框架及中间件的结合既实现了业务逻辑与控制逻辑的...

    JavaCenter Home v2.0源码 build 20101105

    系统用MVC设计模式,采用Struts、Hibernate框架及中间件的结合既实现了业务逻辑与控制逻辑的有效分离,提高了层次结构的清晰度,提高了复用的粒度降低了开发代价和维护代价,同时保证了软件的质量使其更具有鲁棒性...

    JavaCenter Home v2.0 build 1105 安装版

    系统用MVC设计模式,采用Struts、Hibernate框架及中间件的结合既实现了业务逻辑与控制逻辑的有效分离,提高了层次结构的清晰度,提高了复用的粒度降低了开发代价和维护代价,同时保证了软件的质量使其更具有鲁棒性...

Global site tag (gtag.js) - Google Analytics