我有一个列为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" );
}
}
答案 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
设置为您的休眠配置文件。