UTF-16中的Oracle db、UTF-8中的Java hibernate webapp和#x2605;字符未持久化

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

我有一个用Java6+Hibernate(jdbc-oracle瘦客户端)+Guice编写的webapp,它运行在tomcat7+oracle10g上。应用程序完全用UTF-8编码,数据库用UTF-16编码

从中可以看出,客户机使用jvm编码将数据发送到数据库。数据在数据库上转换,应正确保存。不幸的是,当我试图持久化包含
这将作为反向问号保留

我试图设置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显示了一些代码,看到什么错误了吗?