论坛首页 入门技术论坛

HIBERNATE乱码问题

浏览 9134 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-05-12  
我在做一个练习的时候后台数据库是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;
		}
	}
   发表时间:2007-05-12  
你的乱码问题应该和你sybase数据库的语言,字符集,设置有关,和hibernate没有关系的。
0 请登录后投票
   发表时间:2007-05-12  
但是,我把SYBASE的字符集改了好几个,ISO的,GB2312的。UTF-8的都是乱码呀。如果不手动转码的话都是乱码呀。
0 请登录后投票
   发表时间: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;代替
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2007-05-12  
我使用的是MySQL,很正常。会不会是Sybase的设置方法与MySQL不一样呢?查查com.sybase.jdbc2.jdbc.SybDriver的文档,看看能否找到相关的设置
0 请登录后投票
   发表时间: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参数不对呀.
0 请登录后投票
   发表时间:2007-05-13  
genius0182 写道
但是,我把SYBASE的字符集改了好几个,ISO的,GB2312的。UTF-8的都是乱码呀。如果不手动转码的话都是乱码呀。

你还只修改了字符集,但没有同步修改语言设置。
你可以在网上找找sybase到底应该怎样设置?
还有你的数据保存到sybase中,数据正常吗?
0 请登录后投票
   发表时间:2007-05-13  
语言设置我设置了,ISO,UTF-8,CP850都在english下的字符集,gb2312是chinese的字符集。
楼上的说往数据库里插入数据,我还没有试。现在查出来的都是乱码。
0 请登录后投票
   发表时间: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编码节省,因为网页中包含了很多的英文字符。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics