2011-12-26 69 views
3

我使用Hibernate 4.0.0.Final作为应用程序的JPA持久性提供程序,其中包含Oracle 11g数据库(使用UTF-8编码创建)和Oracle WebLogic 11g作为应用服务器。在persistence.xml中配置的方言是org.hibernate.dialect.OracleDialectJPA中的长度属性映射不正确@column

在我的实体,我很喜欢这种映射字符串字段:

@Column(length=20) 
private String description; 

我让JPA处理在数据库中的表的创建。令我惊讶的是,在数据库中的一字段列定义是这样的:

DESCRIPTION VARCHAR2(80 BYTE) 

当我插入的description字段中的值(使用SQL控制台,而不是从应用程序),我可以插入了到80个字符,而不是我预期的20个字符。

这里有什么问题?我想列定义是用80个字节创建的,以允许存储UTF-8字符,但它与数据库级预期的最大字段长度混淆。理想情况下,我想现场看起来像这样:

DESCRIPTION VARCHAR2(20 CHAR) 

但我不知道该如何与CHAR,而不是​​映射一个字符串字段配置Hibernate。有任何想法吗?

回答

3

我用作方言org.hibernate.dialect.OracleDialect引发了这个问题。我挖成的源代码,这行出现在OracleDialect类:

registerColumnType(Types.VARCHAR, 4000, "varchar2($l)"); 

其实,这是一个已知的issue。默认情况下,Oracle为以前的定义生成varchar2($l byte)。如果我切换到org.hibernate.dialect.Oracle10gDialect,为Oracle 11g中的推荐语,以前行结束这样看:

registerColumnType(Types.VARCHAR, 4000, "varchar2($l char)"); 

现在正确的定义获取生成(使用char而不是byte),这解决了我的问题。

+0

嗨奥斯卡,我也面临同样的问题。我知道OracleDialect会默认创建字节类型,但列的大小是如何从20增加到80的呢?它应该是20个字节的权利? – 2013-03-29 09:36:41

+1

20个字符== 80个字节,每个字符占用4个字节 – 2013-03-29 16:02:13