gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:26:38 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com