1

我有一个通过 JAXB 生成的类,我试图将其用作 Hibernate 中的实体。有一些数字字段被定义为 Java BigIntegers。无论我在 DB2 中如何定义该列,Hibernate 都会抱怨以下一些变化:

错误的列类型....对于列 MY_COLUMN 找到:十进制,预期:数字(19,2)。

我尝试过 DB2 bigint,我尝试过数字 (19,2) 等。

我让 Hibernate 选择方言。它正在选择 DB2 方言。如何在 DB2 中定义列,以便 Hibernate 允许我使用它来存储 Java BigInteger?

如果我在 Hibernate 中将其定义为 big_integer,在 DB2 中将其定义为 bigint,我会得到:

错误的列类型....对于列 MY_COLUMN 找到:bigint,预期:数字(19,2)

更新

所以我将 hibernate.hbm2ddl.auto 从 validate 更改为 create 并让 Hibernate 自己创建模式。从日志中我可以看到正在使用数字(19,2)的定义生成创建表语句。在 DB2 中,一旦创建了表,定义就是十进制 (19,2)。该应用程序启动正常。

然后我关闭了应用程序,重新编译设置 hibernate.hbm2ddl.auto 进行验证,然后重新启动。

休眠错误:发现:十进制,预期:数字(19,2)

所以 Hibernate 不能验证它自己创建的模式?

4

1 回答 1

1

Hibernate 模式创建、更新和验证是不应该存在的异常。所有这三个功能都有很多错误,并且知道在几种情况下会失败,所以尽量避免它(这就是为什么有些人专门作为数据库开发人员)。

关于如何存储大整数,如果列是DB2 bigint,可以将其映射为long(都是64位)。

如果您需要超过 64 位,则该列需要是 Numeric,它允许最大为 2^81-1 的整数。Hibernate 会自动将其映射到 BigDecimal 或 BigInteger。

如果您需要存储更大的数字(BigInteger 支持),您需要编写自己的自定义类型以将数字写入 varchar。

附带说明一下,将用于与其他系统通信的对象(您的 xml 对象)与用于持久化的对象(两者都是不同的域)混合在一起是一种非常、非常、非常糟糕的做法。而且我有一种感觉,可能还会使用相同的对象作为您域的一部分,这很糟糕,邪恶,在某些国家/地区是犯罪行为:)。

于 2012-11-12T21:31:31.637 回答