我使用 Hibernate 4.0.0.Final 作为应用程序的 JPA 持久性提供程序,使用 Oracle 11g 数据库(使用 UTF-8 编码创建)和 Oracle WebLogic 11g 作为应用程序服务器。 persistence.xml
中配置的方言是 org.hibernate.dialect.OracleDialect
。
在我的实体中,我像这样映射字符串字段:
@Column(length=20)
private String description;
我让 JPA 处理数据库中表的创建。令我惊讶的是,在数据库中,前一个字段的列定义如下所示:
DESCRIPTION VARCHAR2(80 BYTE)
当我在 description
字段中插入一个值时(使用 SQL 控制台,而不是来自应用程序),我最多可以插入 80 个字符,而不是我预期的 20 个。
这里有什么问题?我猜列定义是用 80 个字节创建的,以允许存储 UTF-8 字符,但它与数据库级别字段的预期最大长度相混淆。理想情况下,我希望该字段看起来像这样:
DESCRIPTION VARCHAR2(20 CHAR)
但我不知道如何配置 Hibernate 以使用 CHAR
而不是 BYTE
映射字符串字段。有什么想法吗?
最佳答案
我使用方言 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
),这解决了我的问题。
关于hibernate - JPA @Column 中长度属性的映射不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8637880/