`
genius0182
  • 浏览: 37604 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

HIBERNATE乱码问题

阅读更多
我在做一个练习的时候后台数据库是Sybase的字符集是cp850用Spring的Hibernate连接后用find()从数据库里取到的值都是乱码,我写了一个方法里到List里把它一项一项的转正了GBK,但是我想问问有没有更好的方法,不用一个一个的转。
下面是applicationContext.xml的代码
<?xml version="1.0" encoding="UTF-8"?>

<!--
	- Application context definition for JPetStore's business layer.
	- Contains bean references to the transaction manager and to the DAOs in
	- dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation").
	
	- in Spring Train by zhangzhenhua 2007.4.23
-->
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:jee="http://www.springframework.org/schema/jee"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
           http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">


  
	<bean id="dataSource"
		class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName">
			<value>com.sybase.jdbc2.jdbc.SybDriver</value>
		</property>
		<property name="url">
			<value>
				jdbc:sybase:Tds:10.201.1.111:5000/sgmarketdatabase
			</value>
		</property>
		<property name="username">
			<value>sa</value>
		</property>
		<property name="password">
			<value>su27ik</value>
		</property>
	</bean>
	
	<!-- 
	<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/sysmanager"/>
	 -->
	<bean id="SessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref bean="dataSource"></ref>
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					org.hibernate.dialect.SybaseDialect
				</prop>
				<prop key="hibernate.show_sql">true</prop>
			</props>
		</property>
		<property name="mappingResources">
			<list>
				<value>
					com/lhd/sysmanager/pojo/MarketRole.hbm.xml
				</value>
				<value>
					com/lhd/sysmanager/pojo/MarketWork.hbm.xml
				</value>
				<value>
					com/lhd/sysmanager/pojo/MarketUser.hbm.xml
				</value>
				<value>
					com/lhd/sysmanager/pojo/WorkLog.hbm.xml
				</value>
				<value>
					com/lhd/sysmanager/pojo/PubDept.hbm.xml
				</value>
				</list>
		</property>
	</bean>
	<bean id="MarketRoleDAO"
		class="com.lhd.sysmanager.dao.imp.MarketRoleDAO">
		<property name="sessionFactory">
			<ref bean="SessionFactory"></ref>
		</property>
	</bean>
	<bean id="MarketWorkDAO"
		class="com.lhd.sysmanager.dao.imp.MarketWorkDAO">
		<property name="sessionFactory">
			<ref bean="SessionFactory"></ref>
		</property>
	</bean>
	<bean id="MarketUserDAO"
		class="com.lhd.sysmanager.dao.imp.MarketUserDAO">
		<property name="sessionFactory">
			<ref bean="SessionFactory"></ref>
		</property>
	</bean>
	<bean id="WorkLogDAO"
		class="com.lhd.sysmanager.dao.imp.WorkLogDAO">
		<property name="sessionFactory">
			<ref bean="SessionFactory"></ref>
		</property>
	</bean>
	<bean id="PubDeptDAO"
		class="com.lhd.sysmanager.dao.imp.PubDeptDAO">
		<property name="sessionFactory">
			<ref bean="SessionFactory"></ref>
		</property>
	</bean>
	<bean id="PageDAO"
		class="com.lhd.sysmanager.dao.imp.PageDAO">
		<property name="sessionFactory">
			<ref bean="SessionFactory"></ref>
		</property>
	</bean>
	<tx:advice id="TxManager"><!-- 事务通知 -->
		<tx:attributes>
			<tx:method name="list*" read-only="true" rollback-for="Exception"/>
			<tx:method name="find*" read-only="true" rollback-for="Exception"/> 
			<tx:method name="query*" read-only="true" rollback-for="Exception"/>
			<tx:method name="add*" rollback-for="Exception"/>
			<tx:method name="dele*" rollback-for="Exception"/>
		</tx:attributes>	
	</tx:advice>
	<aop:config><!-- 事务管理 -->
		  
		<aop:pointcut id="defaultService" expression="execution(* com.lhd.sysmanager.manager.*.*(..))"/>
		<aop:advisor pointcut-ref="defaultService" advice-ref="TxManager"/>
	</aop:config>
	<!-- Spring集成的hibernate事务管理类 -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory"><ref local="SessionFactory"/></property>
    </bean>
    
	<bean id="MarketRoleService" class="com.lhd.sysmanager.manager.MarketRoleManager">
		<property name="dao" ref="MarketRoleDAO"></property>
	</bean>
	
	<bean id="MarketUserService" class="com.lhd.sysmanager.manager.MarketUserManager">
		<property name="dao" ref="MarketUserDAO"></property>
	</bean>
	
	<bean id="MarketWorkService" class="com.lhd.sysmanager.manager.MarketWorkManager">
		<property name="dao" ref="MarketWorkDAO"></property>
	</bean>
	
	<bean id="PubDeptService" class="com.lhd.sysmanager.manager.PubDeptManager">
		<property name="dao" ref="PubDeptDAO"></property>
	</bean>
	<bean id="WorkLogService" class="com.lhd.sysmanager.manager.WorkLogManager">
		<property name="dao" ref="WorkLogDAO"></property>
	</bean>
	<bean id="PageService" class="com.lhd.sysmanager.manager.PageManager">
		<property name="page" ref="PageDAO"></property>
	</bean>
</beans>

下面是find()方法
public List find() {
		log.debug("finding MarketWork instance by example");
		try {
			List results = getHibernateTemplate().find("from com.lhd.sysmanager.pojo.MarketUser u order by u.id desc");
			log.debug("find  successful, result size: "
					+ results.size());
			for(int i= 0;i<result.size();i++)
		 {
			 MarketUser us = (MarketUser)result.get(i);
			 us.setDeptName(PubMethod.ISOtoGBK(us.getDeptName()));
			 System.out.println("#######"+us.getDeptName()+"#####");
		 }			return results;
		} catch (RuntimeException re) {
			log.error("find failed", re);
			throw re;
		}
	}
分享到:
评论
14 楼 genius0182 2007-05-15  
我文档上面也说可以加参数。但我一加参数就出错。这是为什么呀?
jdbc:sybase:Tds:10.201.1.111:5000/sgmarketdatabase?CHARSET=gbk

错误如下:
ERROR JDBCExceptionReporter:78 - Cannot create PoolableConnectionFactory (JZ0I5: 指定了一个无法识别的 CHARSET 属性: gbk
			。)
09:24:06,468  WARN SettingsFactory:109 - Could not obtain connection metadata
org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (JZ0I5: 指定了一个无法识别的 CHARSET 属性: gbk
			。)
13 楼 wuhua 2007-05-14  
movingboy 写道
尝试在dataSource的配置里直接指定字符集试试:

    <bean id="dataSource"  
        class="org.apache.commons.dbcp.BasicDataSource">  
        <property name="driverClassName">  
            <value>com.sybase.jdbc2.jdbc.SybDriver</value>  
        </property>  
        <property name="url">  
            <value>  
                jdbc:sybase:Tds:10.201.1.111:5000/sgmarketdatabase?useUnicode=true&characterEncoding=GBK   
            </value>  
        </property>  
        <property name="username">  
            <value>sa</value>  
        </property>  
        <property name="password">  
            <value>su27ik</value>  
        </property>  
    </bean> 


注意&要使用&amp;代替

觉得这个方式可行。
mysql的就是这样的写法,
使用这个就要看看你的jdbc驱动是否是最新的,有些旧版本的不能自动转换编码,新版本可能有,那就不用了
12 楼 movingboy 2007-05-13  
似乎只需要这样设置就可以了:

jdbc:sybase:Tds:10.201.1.111:5000/sgmarketdatabase?charset=CP936


参见这个帖子:
http://topic.csdn.net/t/20050818/11/4215928.html
11 楼 genius0182 2007-05-13  
我说的意思是我是在english语言下设的那几种字符集。在chinese语言下设的engb字符集。
10 楼 lighter 2007-05-13  
genius0182 写道
语言设置我设置了,ISO,UTF-8,CP850都在english下的字符集,gb2312是chinese的字符集。
楼上的说往数据库里插入数据,我还没有试。现在查出来的都是乱码。

也可以看看下面的资料
9 楼 lighter 2007-05-13  
genius0182 写道
语言设置我设置了,ISO,UTF-8,CP850都在english下的字符集,gb2312是chinese的字符集。
楼上的说往数据库里插入数据,我还没有试。现在查出来的都是乱码。

呵呵,你这样说,不完全对,看这一个吧

引用
2.1. iso8859-1

属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母'a'的编码为0x61=97。

很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码。比如,虽然"中文"两个字不存在iso8859-1编码,以gb2312编码为例,应该是"d6d0 cec4"两个字符,使用iso8859-1编码的时候则将它拆开为4个字节来表示:"d6 d0 ce c4"(事实上,在进行存储的时候,也是以字节为单位处理的)。而如果是UTF编码,则是6个字节"e4 b8 ad e6 96 87"。很明显,这种表示方法还需要以另一种编码为基础。

2.2. GB2312/GBK

这就是汉子的国标码,专门用来表示汉字,是双字节编码,而英文字母和iso8859-1一致(兼容iso8859-1编码)。其中gbk编码能够用来同时表示繁体字和简体字,而gb2312只能表示简体字,gbk是兼容gb2312编码的。

2.3. unicode

这是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。所以可以说它是不兼容iso8859-1编码的,也不兼容任何编码。不过,相对于iso8859-1编码来说,uniocode编码只是在前面增加了一个0字节,比如字母'a'为"00 61"。

需要说明的是,定长编码便于计算机处理(注意GB2312/GBK不是定长编码),而unicode又可以用来表示所有字符,所以在很多软件内部是使用unicode编码来处理的,比如java。

2.4. UTF

考虑到unicode编码不兼容 iso8859-1编码,而且容易占用更多的空间:因为对于英文字母,unicode也需要两个字节来表示。所以unicode不便于传输和存储。因此而产生了utf编码,utf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,utf编码是不定长编码,每一个字符的长度从1-6 个字节不等。另外,utf编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。

注意,虽然说utf是为了使用更少的空间而使用的,但那只是相对于unicode编码来说,如果已经知道是汉字,则使用GB2312/GBK无疑是最节省的。不过另一方面,值得说明的是,虽然utf编码对汉字使用3个字节,但即使对于汉字网页,utf编码也会比unicode编码节省,因为网页中包含了很多的英文字符。
8 楼 genius0182 2007-05-13  
语言设置我设置了,ISO,UTF-8,CP850都在english下的字符集,gb2312是chinese的字符集。
楼上的说往数据库里插入数据,我还没有试。现在查出来的都是乱码。
7 楼 hgq0011 2007-05-13  
genius0182 写道
但是,我把SYBASE的字符集改了好几个,ISO的,GB2312的。UTF-8的都是乱码呀。如果不手动转码的话都是乱码呀。

你还只修改了字符集,但没有同步修改语言设置。
你可以在网上找找sybase到底应该怎样设置?
还有你的数据保存到sybase中,数据正常吗?
6 楼 genius0182 2007-05-12  
我在网上找到一个
jdbc:sybase:Tds:10.201.1.111:5000/sgmarketdatabase?charset=CP850&amp;jconnect_version=5

但是启动服务时抛出这个错误
Cannot create PoolableConnectionFactory (JZ011: 分析连接属性 JCONNECT_VERSION 时遇到异常格式。)

我是不是这个URL参数不对呀.
5 楼 movingboy 2007-05-12  
我使用的是MySQL,很正常。会不会是Sybase的设置方法与MySQL不一样呢?查查com.sybase.jdbc2.jdbc.SybDriver的文档,看看能否找到相关的设置
4 楼 genius0182 2007-05-12  
我按楼上说的换成了下面的
jdbc:sybase:Tds:10.201.1.111:5000/sgmarketdatabase?useUnicode=true&amp;characterEncoding=GBK
但还是不好用,下面是出的信息
 WARN JDBCExceptionReporter:54 - SQL Warning: 0, SQLState: 010TP
14:32:51,531  WARN JDBCExceptionReporter:55 - 010TP: 服务器无法转换连接的初始字符集 null。将使用服务器建议的字符集 Cp850,并由 jConnect执行转换。
14:32:51,546  WARN JDBCExceptionReporter:54 - SQL Warning: 0, SQLState: 010UP
14:32:51,546  WARN JDBCExceptionReporter:55 - 010UP: 忽略了无法识别的连接属性 useUnicode。
14:32:51,546  WARN JDBCExceptionReporter:54 - SQL Warning: 0, SQLState: 010UP
14:32:51,562  WARN JDBCExceptionReporter:55 - 010UP: 忽略了无法识别的连接属性 characterEncoding。
14:32:51,578  WARN JDBCExceptionReporter:54 - SQL Warning: 0, SQLState: 010SK
3 楼 movingboy 2007-05-12  
尝试在dataSource的配置里直接指定字符集试试:

    <bean id="dataSource"  
        class="org.apache.commons.dbcp.BasicDataSource">  
        <property name="driverClassName">  
            <value>com.sybase.jdbc2.jdbc.SybDriver</value>  
        </property>  
        <property name="url">  
            <value>  
                jdbc:sybase:Tds:10.201.1.111:5000/sgmarketdatabase?useUnicode=true&characterEncoding=GBK   
            </value>  
        </property>  
        <property name="username">  
            <value>sa</value>  
        </property>  
        <property name="password">  
            <value>su27ik</value>  
        </property>  
    </bean> 


注意&要使用&amp;代替
2 楼 genius0182 2007-05-12  
但是,我把SYBASE的字符集改了好几个,ISO的,GB2312的。UTF-8的都是乱码呀。如果不手动转码的话都是乱码呀。
1 楼 hgq0011 2007-05-12  
你的乱码问题应该和你sybase数据库的语言,字符集,设置有关,和hibernate没有关系的。

相关推荐

    hibernate+mysql乱码问题

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

    hibernate数据库中文乱码问题

    ### Hibernate数据库中文乱码问题详解 #### 背景与问题描述 在使用Hibernate框架进行数据库操作时,可能会遇到中文乱码的问题。特别是在使用MySQL作为数据库,并且已将数据库编码设置为`utf-8`的情况下,依然出现...

    hibernate_中文乱码

    根据提供的文件信息,我们可以推断出这段代码是关于一个用于设置请求字符编码的过滤器(Filter),主要目的是解决在Hibernate框架使用过程中遇到的中文乱码问题。下面将详细阐述与标题、描述及部分代码相关的关键...

    解决struts2.1.6+spring+hibernate 中文乱码

    ### 解决Struts2.1.6 + Spring + Hibernate 中文乱码问题 在Web开发过程中,特别是使用Java EE框架时,字符编码问题一直是开发者关注的重点之一。对于使用Struts2.1.6、Spring以及Hibernate这三个框架组合的项目而...

    解决hibernate与MySql存储中文时出现乱码问题

    以下是解决hibernate与MySQL存储中文时出现乱码问题的详细步骤和相关知识点: 1. **配置Hibernate连接URL**: 在`hibernate.cfg.xml`配置文件中,需要正确设置连接URL以指定字符集。添加`useUnicode=true`和`...

    Hibernate_MySQL中文乱码问题.doc

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

    解决hibernate 反向工程 备注中文乱码

    该项目是解决hibernate反向工程生成的实体文件中文备注乱码问题的。 试用环境 hibernate-version 4.0.1 Hibernate Tools 5.1.4.v20170413-1729 org.hibernate.eclipse.feature.feature.group JBoss by Red Hat ...

    Hibernate-tools解决hbm.xml中文注释乱码和生成实体类注释

    在Java的持久层框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它极大地简化了数据库操作。...通过合理配置和使用,我们可以避免乱码问题,并生成符合规范的带有丰富注释的实体类代码。

    自己的修改hibernate-tools的模板和修复Comment乱码问题

    NULL 博文链接:https://kennylee26.iteye.com/blog/1229993

    hibernate的中文问题的解决方案

    通过以上两种方法之一,可以有效地解决Hibernate在处理中文字符时出现的乱码问题。关键在于确保客户端与服务器端之间传输数据时所使用的字符集保持一致。如果仍然遇到问题,建议检查数据库表的字符集设置、应用程序...

    hibernate+mysql 中文存入数据库乱码解决方法

    综上所述,解决hibernate+mysql环境下中文存入数据库乱码的问题,需要从Web应用配置、数据库配置、框架配置以及文件编码等多个方面综合考虑,确保整个数据处理链路的字符集一致且支持UTF-8。只有这样,才能确保中文...

    struts-hibernate-sprint开发详解 乱码问题 连接池

    关于乱码问题,通常需要在Servlet容器(如Tomcat)和应用程序中设置正确的字符编码。例如,在HTTP响应头中设置`Content-Type`为`text/html;charset=UTF-8`,并在JSP页面中使用`;charset=UTF-8"%&gt;`。此外,确保数据库...

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

    本文将详细介绍如何在使用Hibernate框架进行数据库操作时解决中文乱码问题,特别是针对MySQL数据库。 #### Hibernate与乱码问题概述 在Java开发中,Hibernate作为一种流行的ORM(Object Relational Mapping)框架...

    解决J2EE开发中乱码问题

    J2EE开发中遇到的乱码问题是一个常见的困扰,尤其是在处理中文字符时。本文将详细介绍如何解决这些问题,以一个基于Eclipse 3.3 + MyEclipse 6.0 + Tomcat 5.5的项目为例,该项目采用了Ext、Struts和Hibernate框架。...

    Struts+Hibernate+MyEclipse+Tomcat+MySQL的乱码之解决篇

    在本篇文章中,我们将深入探讨如何解决Struts + Hibernate + MyEclipse + Tomcat + MySQL环境中出现的乱码问题。该问题通常出现在处理中文字符时,由于编码设置不当导致中文显示为乱码或无法正常读取。为了确保系统...

    解析Hibernate + MySQL中文乱码问题

    本文将深入解析在使用Hibernate框架与MySQL数据库时遇到的中文乱码问题,以及如何解决这一问题。 首先,我们需要理解中文乱码出现的根本原因。当Java应用程序中的持久化类包含中文字符串,并通过Hibernate映射到...

    mysql乱码问题解决

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

    SQL-SERVER-64位配置ORACLE连接-中文乱码问题

    ### SQL-SERVER-64位配置ORACLE连接-中文乱码问题 在IT行业中,不同数据库之间的连接配置是一项常见的任务,特别是在需要实现跨平台数据交换的场景下。本文将详细介绍如何解决64位系统下的SQL Server连接Oracle...

    java web hibernate struts spring 全方位解决乱码

    在Java Web开发中,我们经常会遇到各种乱码问题,特别是在使用Hibernate、Struts和Spring等框架时。这些框架处理数据的方式以及与数据库交互的过程都可能导致字符编码不一致,从而引发乱码现象。以下是对这些技术全...

Global site tag (gtag.js) - Google Analytics