【发布时间】:2016-05-20 16:48:16
【问题描述】:
我有一个用 Java6 + Hibernate (jdbc oracle 瘦客户端) + Guice 在 tomcat7 + ORACLE 10g 上运行的 webapp。应用程序完全采用 UTF-8 编码,数据库采用 UTF-16 编码。
从Oracle Docs我看到客户端使用jvm编码向DB发送数据。数据在 db 上转换,应该正确持久化。不幸的是,当我尝试保留一个包含 ★ 的字符串时,这将作为一个反向问号保留。
我尝试设置jvm参数-Dfile.encoding=UTF8,但是没有成功。还有其他可能的解决方案吗?
更新:
给定一个实体
@Entity
@Table(name="bean")
public class Bean{
private String name;
private String surname;
//getters and setters
}
扩展BasePersistentService 的服务,允许数据访问, 一个有两列的“bean”表:
name nvarchar2(200),
surname varchar2(200)
具体用例如下:
// context initialized, BeanService injected in the variable beanService
Bean p = new Bean();
p.setName("myLittleStar★");
p.setSurname("nope");
beanService.save(p);
然后在数据库上:
select * from bean;
结果:
name: 'myLittleStar¿'
surname: 'nope'
这是单个 jdbc 资源
<Resource name="jdbc/dbConnPool" auth="Container"
factory="oracle.ucp.jdbc.PoolDataSourceImpl" type="oracle.ucp.jdbc.PoolDataSource"
description="Connection Pool DB" connectionFactoryClassName="oracle.jdbc.pool.OracleDataSource"
initialPoolSize="10" minPoolSize="10" maxPoolSize="90" maxStatements="100"
connectionWaitTimeout="30" inactiveConnectionTimeout="20"
abandonedConnectionTimeout="600" user="*******" password="*******"
url="*******" fastConnectionFailoverEnabled="true"
onsConfiguration="*******" connectionPoolName="UCPPool"
validateConnectionOnBorrow="true" />
这是hibernate cfg的相关部分
<session-factory>
<property name="hibernate.search.default.directory_provider">
org.hibernate.search.store.FSDirectoryProvider
</property>
<property name="connection.datasource">java:comp/env/jdbc/dbConnPool</property>
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="archive.autodetection">class, hbm</property>
</session-factory>
我还没有找到在文件中设置编码的可能配置。
另外我发现无法在oracle连接字符串中配置编码。
如果我能提供更多有用的数据,请告诉我。
编辑 2: 将'bean'表中'name'列的类型由varchar2替换为nvarchar2,这并不能解决问题,但很有必要。
【问题讨论】:
-
file.encoding在这里无济于事;您必须教 Oracle 的 JDBC 驱动程序使用正确的编码。你展示了一些代码怎么样? -
代码大约 3 小时进来,抱歉耽搁了
-
@Gabber 说你有效地解决了这个问题,很快人们就会投票关闭/关闭这个问题,因为你没有提供任何代码。建议你手动删除,有时间放代码的时候再取消删除
-
我希望这不会发生。我没有发布任何代码,因为这不是关于代码本身,而是关于配置。也许休眠配置文件和 jdbc 配置可能会有所帮助,我会尽快发布它们。
-
@fge 显示了一些代码,看看有什么问题吗?
标签: java oracle hibernate encoding utf-8