【问题标题】:How to store BigInteger in a H2/PSQL database using JPA?如何使用 JPA 将 BigInteger 存储在 H2/PSQL 数据库中?
【发布时间】:2020-10-06 08:18:45
【问题描述】:

我正在尝试将 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 类型允许保留两位小数?

【问题讨论】:

    标签: java jpa spring-data-jpa h2


    【解决方案1】:

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

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

    @Lob
    byte[] hash;
    

    假设是 Postgresql,你可以在这里查看空间需求:https://www.postgresql.org/docs/current/datatype.html

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

    【讨论】:

    • 我需要能够查询哈希。我可以使用数据库中的 byte[] 有效地做到这一点吗?还是会触发全表搜索?我还想在其上放置一个唯一索引,我 99% 确信它不适用于 byte[] / blob,但我也可能错了。
    • 如果没有索引,AFAIK 将始终触发全表搜索。但我的研究表明,您可以在 Postgresql 中对 bytea 列进行唯一索引。不幸的是,文档中没有明确提到,但我在邮件列表中找到了一些东西,并且这个堆栈交换 QA:dba.stackexchange.com/questions/229677/…
    【解决方案2】:

    我用

    强制列类型
    @Column(precision = 100, scale = 0)
    

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

    【讨论】:

    • 您需要大约 78 位的精度。对于 Postgresql,大约是这样。 39 字节 + 3-8 字节开销(根据文档)=~ 45 字节。 base64 编码字符串的 varchar(64) 需要 65 个字节。一个字节茶列 32+(1 到 4)或最多 36 个字节。
    • 再一次,我也会争论类型及其预期用途。这传达了“这是一个要计算的数字”。你想让人们加、减、乘、改变你的哈希符号吗?我对此表示怀疑。这只是一堆字节。
    【解决方案3】:

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

    @Column(columnDefinition = "BIGINT")

    【讨论】:

      猜你喜欢
      • 2019-03-31
      • 2017-10-22
      • 2017-07-24
      • 2019-03-03
      • 2017-02-02
      • 2011-03-07
      • 2017-06-16
      • 1970-01-01
      • 2020-07-22
      相关资源
      最近更新 更多