【问题标题】:Oracle db in UTF-16, Java hibernate webapp in UTF-8, ★ character not persistedUTF-16 中的 Oracle db,UTF-8 中的 Java hibernate webapp,★ 字符不持久
【发布时间】: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


【解决方案1】:

可怕但有效的解决方案:

使用 urlencode、Base64 或更适合您需要的编码算法对需要持久化的字符串进行编码。当然,编码必须产生一个不包含无法在数据库中持久化的字符的输出。

您可以包装您的实体或更改设置器。从数据库中获取实体时,您必须反过来解码字符串。

这是一个丑陋的解决方法,但它在本地解决了问题。

【讨论】:

    猜你喜欢
    • 2012-10-08
    • 2019-07-31
    • 2012-02-22
    • 2016-05-31
    • 2012-08-18
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多