【问题标题】:Hibernate 6, Postgres, and byteaHibernate 6、Postgres 和 bytea
【发布时间】:2023-01-08 04:52:29
【问题描述】:

随着发布休眠 6,我又一次挠头试图弄清楚如何让 Hibernate 转换一个@高球到字节跳动为一个Postgres数据库。我还需要代码可以使用 H2(或任何内存数据库)进行测试。

我使用的是 Postgres 10+ (v13),因此可以满足该要求。

这是我之前使用的,这很棘手,因为我还需要它来使用 H2。 (PostGres 方言仅在生产中加载,未在测试中加载。)

遗憾的是,让 bytea 工作“超出了 Hibernate 6 用户指南的范围”。参见 2.2.47。 https://docs.jboss.org/hibernate/orm/6.0/userguide/html_single/Hibernate_User_Guide.html

迁移指南似乎也对这个话题保持沉默。 https://github.com/hibernate/hibernate-orm/blob/6.0/migration-guide.adoc

SQLDialect 系列的整个 API 都已重写,所以我回到第 1 个方块。

public class CustomPostgresSQL10Dialect extends PostgreSQL10Dialect{

  public CustomPostgresSQL10Dialect() {
    super();
    registerColumnType(Types.BLOB, "bytea");
  }

  @Override
  public SqlTypeDescriptor remapSqlTypeDescriptor(SqlTypeDescriptor sqlTypeDescriptor) {
    if (sqlTypeDescriptor.getSqlType() == java.sql.Types.BLOB) {
      return BinaryTypeDescriptor.INSTANCE;
    }

    return super.remapSqlTypeDescriptor(sqlTypeDescriptor);
  }
}

【问题讨论】:

    标签: java postgresql hibernate


    【解决方案1】:

    很难确定,因为你还没有告诉我们爪哇您尝试使用 @Lob 注释映射的字段类型是,但是该死,就这一次,我将尝试阅读您的想法,并且推测你写的是这样的:

    @Lob 
    byte[] binaryData;
    

    现在,Postgres JDBC 驱动程序不支持使用 LOB API 读/写 bytea 列,Hibernate 知道这一点,所以它做了下一个最明智的事情,并假设这个字段映射到 @987654324 @ 柱子。事实证明这不是你想要的。

    现在,如果您试图通过以下方式绕过 Hibernate 对 postgres 的了解:

    @Lob @Column(columnDefinition="bytea") 
    byte[] binaryData;
    

    然后你会从 Postgres 或其驱动程序(我忘了是哪个)那里得到一个错误,因为正如我所说,postgres 驱动程序不支持这个。

    那么该怎么办?

    好吧,当然,您可以像上面那样尝试破解 Hibernate Dialect,告诉 Hibernate 执行以下操作:

    1. 对 JDBC 类型 BLOB 使用 bytea,以及
    2. 使用 JDBC 类型 BINARY 或 VARBINARY 或其他类型的常规处理来绑定 JDBC BLOBs。

      是的,您仍然可以在 H6 中轻松完成这项工作。

      或者,你知道,你可以删除愚蠢的 @Lob 注释,它在这里没有做任何有用的工作,并让 Hibernate 将您的字段视为 varbinary,默认情况下映射到 bytea。

      byte[] binaryData;
      

      现在,你看,你在这里做的事情可能还有更多内容,但是你需要通过实际发布该字段的详细信息以及你如何映射它来帮助我。 (我真的不知道为什么你会把它排除在你的问题之外。)

    【讨论】:

      猜你喜欢
      • 2013-07-14
      • 2016-09-29
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      相关资源
      最近更新 更多