gpt4 book ai didi

java - 使用 Oracle 10g 时 Hibernate 的浮点列模式验证已知问题的最佳解决方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 22:39:09 24 4
gpt4 key购买 nike

我有几个带有双字段的 Java 类,我通过 Hibernate 保留它们。例如,我有

@Entity
public class Node ...

private double value;

当 Hibernate 的 org.hibernate.dialect.Oracle10gDialect 为节点表创建 DDL 时,它将值字段映射到“ double ”类型。

create table MDB.Node (... value double precision not null, ...

在 Oracle 中,“ double ”似乎是“ float ”的别名。因此,当我尝试使用 org.hibernate.cfg.AnnotationConfiguration.validateSchema() 方法验证数据库模式时,Oracle 似乎将值列描述为“ float ”。这导致 Hibernate 抛出以下异常

org.hibernate.HibernateException: Wrong column type in DBO.ACL_RULE for column value. Found: float, expected: double precision

一个非常相似的问题在 Hibernate 的 JIRA 数据库中列为 HHH-1961 .我想避免做任何会破坏 MySql、Postgres 和 Sql Server 支持的事情,因此扩展 Oracle10gDialect 似乎是 HHH-1961 中提到的最有前途的解决方法。 .但是扩展方言是我以前从未做过的事情,我担心可能会有一些令人讨厌的陷阱。在不破坏我们与 MySql、Postgres 和 Sql Server 的兼容性的情况下,解决此问题的最佳解决方法是什么?

最佳答案

这是一个 known limitation模式 validator 的检查 HHH-2315 .所以你在这里有三个选项(实际上是四个,但我想不需要停用验证)。要么:

  • 在 Java 级别使用 float 而不是 double - 虽然这可能不是一个选项。

  • 补丁 org.hibernate.mapping.Table.validateColumns(Dialect dialect, Mapping mapping, TableMetadata tableInfo) 为这个特殊情况添加特殊条件 - 这不是真正的灯选项。

  • 扩展 org.hibernate.dialect.Oracle10gDialect 使其使用 float 作为 SQL 类型 DOUBLE

    public class MyOracle10gDialect extends Oracle10gDialect {
    public MyOracle10gDialect() {
    super();
    }
    protected void registerNumericTypeMappings() {
    super.registerNumericTypeMappings();
    registerColumnType( Types.DOUBLE, "float" );
    }
    }

后一种选择似乎是安全的,但需要进行一些测试以查看它是否不会引入任何回归。我没有看 Oracle 的 JDBC 驱动程序代码,所以我不能说 floatdouble precision 在驱动程序级别有何不同。

关于java - 使用 Oracle 10g 时 Hibernate 的浮点列模式验证已知问题的最佳解决方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2625600/

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