hibernate - JPA @Column 中长度属性的映射不正确

标签 hibernate jpa orm oracle11g hibernate-mapping

我使用 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/

相关文章:

python - Storm ORM 和自动生成表

java - JPA 映射 - 从不同的表中检索属性

java - Hibernate join 没有外键并且只映射一个表

java - 如何按常规字段映射表?

java - 从 hibernate session 中删除对象?

java - 从多对多关系返回值

java - Spring Boot中如何连接多个数据库

java - 已用堆大小持续增加

java - Kotlin 数据类 equals() 方法是否可以在不进一步修改的情况下与 JPA 一起使用?

python - AppEngine 中的非数据存储类型列表?