Hibernate Session的get()函数检索问号而不是希腊字符

时间:2011-05-04 12:00:20

标签: spring hibernate tomcat encoding utf-8

我有一个使用spring和hibernate的web应用程序。我的hibernate会话工厂在spring中配置为:

<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="myDataSource" />
    <property name="configurationClass">
        <value>org.hibernate.cfg.AnnotationConfiguration</value>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.SQLServer2005Dialect</prop>
            <prop key="hibernate.cache.use_query_cache">false</prop>
            <prop key="hibernate.cache.use_second_level_cache">false</prop>
        </props>
    </property>
    <property name="packagesToScan">
        <list>
            <value>com.example.dslibweb.model</value>
        </list>
    </property>
</bean>

数据来源为:

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="maxActive" value="${jdbc.maxConnections}" />
</bean>

并且数据源的属性文件是:

jdbc.username=sa
jdbc.password=***
jdbc.url=jdbc:sqlserver://10.62.0.105:1433;databaseName=example;useUnicode=true;characterEncoding=utf-8
jdbc.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc.maxConnections=-1

我有一个电话:

DsActions action = (DsActions) this.hibernateCriteriaCommons.findById(id, new DsActions());

和findById定义为:

public T findById(String id, Object model) {
    return (T) this.sessionFactory.getCurrentSession().get(model.getClass(), id);
}

所以我正在为特定的id调用hibernate会话的get方法,我希望得到一个类型为DsActions的实例。

当我从本地Tomcat实例(通过netbeans运行)运行它时,一切正常。

当我在远程tomcat服务器上安装它时,DsActions的实例似乎有编码问题。当重新检索DsActions实例的字段时,我得到问号(???????????)。该文本应该是希腊字符

我很困惑,我不明白为什么在第一种情况下它工作而不是在第二种情况下。 注意:数据由同一个数据库服务器检索,因此没有区别。唯一的区别是应用程序运行的机器。

提前谢谢大家。

1 个答案:

答案 0 :(得分:4)

我很确定Hibernate正确检索该字段,问题在于输出这些字符的方式。

作为快速检查,您可以在代码中添加f.contains("?")等条件并输出结果 - 它应为false(如果原始字符串不包含? s,当然)。

有关输出中可能出现的问题,请参阅Unicode - How to get the characters right?