使用NVARCHAR2进行休眠

时间:2014-12-31 11:53:16

标签: hibernate oracle11g hibernate-mapping nvarchar

我有一个列为NVARCHAR2的表,并且我使用hibernate注释构建了我的对象,当我想插入DB或从DB中获取时,结果就像那样“?????? ?”, 我已经实现了如下自定义方言,但它没有用。

public class CustomOracleDialect extends Oracle10gDialect{

    public CMSCustomOracleDialect() {
        registerHibernateType( Types.NVARCHAR, Hibernate.STRING.getName() );
        registerColumnType( Types.VARCHAR, "nvarchar2($1)" );
        registerColumnType( Types.CLOB, "nclob" );
        registerColumnType( Types.NCLOB, "nclob" );
    }

}

3 个答案:

答案 0 :(得分:3)

可能会有点晚,但我刚刚遇到这个问题,我发现可以用

注释你的hibernate类
@Nationalized

@Type(type="org.hibernate.type.StringNVarcharType")

使您的元素使用org.hibernate.type.StringNVarcharType而不是VarChar类型字符串

在4.1.10及更高版本中引入了hibernate。这样它就可以正确地使用NVarChar2类型,否则它会默认返回到VarChar2,然后会丢失你的国际字符。

Hibernate Jira解决了这个问题:https://hibernate.atlassian.net/browse/HHH-5869

和Jboss-Hibernate文档: https://docs.jboss.org/hibernate/orm/4.3/devguide/en-US/html/ch08.html#value-national-character-types

答案 1 :(得分:2)

如何在对象中映射列?以下映射有效

@Column(name = "PHONE_NUMBER", nullable = false, columnDefinition = "nvarchar2 (2000)")
public String getPhoneNumber() {
    return this.phoneNumber;
}

请注意,这是JPA @Column注释。在手机对象上调用entityManager.persist()可以正常工作。

答案 2 :(得分:0)

public class CustomOracleDialect extends Oracle10gDialect {

    public CustomOracleDialect() {
        super();
        registerColumnType(Types.NVARCHAR, "nvarchar2($l)");//$l not $1
        registerHibernateType(Types.NVARCHAR, StandardBasicTypes.STRING.getName());
    }
}

然后将CustomOracleDialect设置为您的休眠配置文件。