使用Oracle 10g时,Hibernate对浮点列的模式验证的已知问题有哪些最佳解决方法?

Jas*_*vak 18 java oracle orm hibernate

我有几个带有双字段的Java类,我通过Hibernate持久化.例如,我有

@Entity
public class Node ...

  private double value;
Run Code Online (Sandbox Code Playgroud)

当Hibernate org.hibernate.dialect.Oracle10gDialect为Node表创建DDL时,它会将value字段映射为"double precision"类型.

create table MDB.Node (... value double precision not null, ...
Run Code Online (Sandbox Code Playgroud)

看起来在Oracle中,"double precision"是"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
Run Code Online (Sandbox Code Playgroud)

Hibernate的JIRA数据库中列出了一个非常类似的问题,如HHH-1961.我想避免做任何会破坏MySql,Postgres和Sql Server支持的事情,因此扩展Oracle10gDialect似乎是HHH-1961中提到的最有希望的解决方法.但延伸一个方言是我以前从未做过的事情,我担心可能会有一些讨厌的问题.这个问题的最佳解决方法是什么,不会破坏我们与MySql,Postgres和Sql Server的兼容性?

Pas*_*ent 21

这是模式验证器的已知限制,请查看HHH-2315.所以你在这里有三个选项(实际上是四个,但我想不需要停用验证).或者:

  • 在Java级别使用a float而不是a 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" );
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

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


小智 6

只需添加(columnDefinition ="NUMBER(9,2)")即可使用!

@Column(name = "CREDIT_AMOUNT", columnDefinition = "NUMBER(9,2)")
@Basic
private double creditAmount;
Run Code Online (Sandbox Code Playgroud)

  • 它可以工作,但如果你只打算与Oracle合作.如果要更改基础数据库,或者必须支持多个数据库,则无法运行.您必须将此添加到模型中的每个双字段.所以不,不是最好的答案. (3认同)