我有一个使用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实例的字段时,我得到问号(???????????)。该文本应该是希腊字符
我很困惑,我不明白为什么在第一种情况下它工作而不是在第二种情况下。 注意:数据由同一个数据库服务器检索,因此没有区别。唯一的区别是应用程序运行的机器。
提前谢谢大家。
答案 0 :(得分:4)
我很确定Hibernate正确检索该字段,问题在于输出这些字符的方式。
作为快速检查,您可以在代码中添加f.contains("?")
等条件并输出结果 - 它应为false
(如果原始字符串不包含?
s,当然)。
有关输出中可能出现的问题,请参阅Unicode - How to get the characters right?。