锁定老帖子 主题:HIBERNATE乱码问题
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-12
下面是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; } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-05-12
你的乱码问题应该和你sybase数据库的语言,字符集,设置有关,和hibernate没有关系的。
|
|
返回顶楼 | |
发表时间:2007-05-12
但是,我把SYBASE的字符集改了好几个,ISO的,GB2312的。UTF-8的都是乱码呀。如果不手动转码的话都是乱码呀。
|
|
返回顶楼 | |
发表时间: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;代替 |
|
返回顶楼 | |
发表时间:2007-05-12
我按楼上说的换成了下面的
jdbc:sybase:Tds:10.201.1.111:5000/sgmarketdatabase?useUnicode=true&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 |
|
返回顶楼 | |
发表时间:2007-05-12
我使用的是MySQL,很正常。会不会是Sybase的设置方法与MySQL不一样呢?查查com.sybase.jdbc2.jdbc.SybDriver的文档,看看能否找到相关的设置
|
|
返回顶楼 | |
发表时间:2007-05-12
我在网上找到一个
jdbc:sybase:Tds:10.201.1.111:5000/sgmarketdatabase?charset=CP850&jconnect_version=5 但是启动服务时抛出这个错误 Cannot create PoolableConnectionFactory (JZ011: 分析连接属性 JCONNECT_VERSION 时遇到异常格式。) 我是不是这个URL参数不对呀. |
|
返回顶楼 | |
发表时间:2007-05-13
genius0182 写道 但是,我把SYBASE的字符集改了好几个,ISO的,GB2312的。UTF-8的都是乱码呀。如果不手动转码的话都是乱码呀。
你还只修改了字符集,但没有同步修改语言设置。 你可以在网上找找sybase到底应该怎样设置? 还有你的数据保存到sybase中,数据正常吗? |
|
返回顶楼 | |
发表时间:2007-05-13
语言设置我设置了,ISO,UTF-8,CP850都在english下的字符集,gb2312是chinese的字符集。
楼上的说往数据库里插入数据,我还没有试。现在查出来的都是乱码。 |
|
返回顶楼 | |
发表时间: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编码节省,因为网页中包含了很多的英文字符。 |
|
返回顶楼 | |