UTF-16中的Oracle db、UTF-8中的Java hibernate webapp和#x2605;字符未持久化
我有一个用Java6+Hibernate(jdbc-oracle瘦客户端)+Guice编写的webapp,它运行在tomcat7+oracle10g上。应用程序完全用UTF-8编码,数据库用UTF-16编码 从中可以看出,客户机使用jvm编码将数据发送到数据库。数据在数据库上转换,应正确保存。不幸的是,当我试图持久化包含UTF-16中的Oracle db、UTF-8中的Java hibernate webapp和#x2605;字符未持久化,java,oracle,hibernate,encoding,utf-8,Java,Oracle,Hibernate,Encoding,Utf 8,我有一个用Java6+Hibernate(jdbc-oracle瘦客户端)+Guice编写的webapp,它运行在tomcat7+oracle10g上。应用程序完全用UTF-8编码,数据库用UTF-16编码 从中可以看出,客户机使用jvm编码将数据发送到数据库。数据在数据库上转换,应正确保存。不幸的是,当我试图持久化包含★这将作为反向问号保留 我试图设置jvm参数-Dfile.encoding=UTF8,但没有成功。还有其他可能的解决办法吗 更新: 给定实体 @Entity @Table(nam
★代码>这将作为反向问号保留
我试图设置jvm参数-Dfile.encoding=UTF8
,但没有成功。还有其他可能的解决办法吗
更新:
给定实体
@Entity
@Table(name="bean")
public class Bean{
private String name;
private String surname;
//getters and setters
}
允许数据访问的服务扩展,
包含两列的“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);
然后在db上:
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>
org.hibernate.search.store.FSDirectoryProvider
java:comp/env/jdbc/dbConnPool
org.hibernate.dialen.oracle10galent
班级,哈佛商学院
我还没有找到在文件中设置编码的可能配置
此外,我发现不可能在oracle连接字符串中配置编码
告诉我是否可以提供更多有用的数据
编辑2:
将“bean”表中的列“name”的类型从varchar2替换为nvarchar2,这并不能解决问题,但却是必需的。可怕但有效的解决方案:
使用urlencode、Base64或更适合您需要的编码算法对需要持久化的字符串进行编码。当然,编码必须生成一个不包含无法在数据库中持久化的字符的输出
您可以包装实体或更改setter。从数据库中获取实体时,必须反过来解码字符串
这是一个丑陋的解决方法,但它在本地解决了问题。文件。编码在这里没有帮助;您必须教会Oracle的JDBC驱动程序使用正确的编码。你给我看了一些密码怎么办?密码大约3小时就来了,对不起delay@Gabber如果说你实际上注定了这个问题,那么很快人们就会投票关闭这个问题,因为你没有提供任何代码。我建议您手动删除它,并在有时间将代码放入inI时取消删除,希望不会发生这种情况。我没有发布任何代码,因为这不是关于代码本身,而是关于配置。也许hibernate配置文件和jdbc配置会有帮助,我会尽快发布它们。@fge显示了一些代码,看到什么错误了吗?