1

我正在尝试将 SHA256 哈希存储为数值,这似乎是从空间和索引 POV 执行此操作的最佳方式。我正在使用具有简单字段定义的 JPA:

@NonNull
private BigInteger mybiginteger;

但是,它拒绝插入该值。

我在单元测试期间使用 H2 数据库,现在我在 JPA 中添加了一个 BigInteger 值,它失败了

Caused by: org.h2.jdbc.JdbcSQLDataException: Value too long for column "MYBIGINTEGER DECIMAL(19, 2)": "-12804752987762098394035772686106585063470084017442529046078187006797464553387.00 (79)"; SQL statement:

跳过测试用例并使用 Postgres 尝试它也失败了

Caused by: org.postgresql.util.PSQLException: ERROR: numeric field overflow
  Detail: A field with precision 19, scale 2 must round to an absolute value less than 10^17.

JPA 根据 DB 工具将其创建为 numeric(19,2) 字段。我可以手动更改列定义并且它可以工作,但不能将其设置为在 H2 和 PSQL 之间可移植。

如何使用 JPA 将 BigInteger 正确存储在 H2/PSQL 数据库中?另外,为什么 BigInteger 类型允许保留两位小数?

4

3 回答 3

1

我通过在属性上添加以下注释解决了这个问题。

@Column(columnDefinition = "BIGINT")

于 2022-01-06T01:43:22.780 回答
0

我不同意 BigInteger 是哈希的正确类型。你想用你的哈希做算术吗?我不这么认为。

例如, JavaMessageDigest会给你一个byte[]带有散列的数组。您可以将字节数组有效地映射为二进制/BLOB 列。另一种可移植的方式是将其存储为 base64 编码的字符串。

@Lob
byte[] hash;

假设 Postgresql,您可以在此处查看空间要求:https ://www.postgresql.org/docs/current/datatype.html

“bytea”列类型最多需要 32 + 4 个字节。您可以在该列类型上创建 indizes 等。

于 2020-06-16T16:45:22.667 回答
0

我强制使用列类型

@Column(precision = 100, scale = 0)

精度 100 可能太高了,但我稍后会计算出正确的值。

于 2020-06-16T18:15:23.463 回答