hibernate ,PostgreSQL : Column "x" is of type oid but expression is of type byte

标签 hibernate postgresql annotations arrays oid

当在不同数据库之间切换时,我有一个关于包含大对象 (BLOB) 的 hibernate 映射的奇怪问题。

@Lob
private byte[] binaryData;

上面的字段在 MySQL 和 Oracle 中创建了一个字节数组字段,但是在 PostreSQL 中它创建了一个 oid 类型的字段。

现在,当我尝试访问这个字段时,它在其他数据库中工作正常,但在 PostgreSQL 中它失败并出现以下错误

Column "binaryData" is of type oid but expression is of type bytea.

所以我尝试简单地删除“@Lob”注解,这将解决 PostgreSQL 的问题,但是在没有这个注解的 MySQL 中,hibernate 会创建一个“tinyblob”类型的字段,这在我们的大多数情况下都太小了.而且,由于我们想在多个环境中使用这个项目,切换两个不同的映射很烦人。

是否有任何注释强制 postgreSQL 对使用 @Lob 注释的字段使用 bytea 而不是 oid?或者是否有可能省略 @Lob 并放置其他内容以强制 MySQL 为其分配更大的数据类型,就像使用 @Lob 一样?

我什至可以想象有这样的解决方案

if (field is of type oid)
  store it as oid
else if (field is of type bytea)
  store it as bytea
else
  // not storable

和 getter 一样,如果有办法做到这一点的话

编辑:

以下声明有效。它将列分配为 oid,但是使用它的 hibernate 知道如何从这样的字段存储和检索数据

@Lob
@Type(type="org.hibernate.type.PrimitiveByteArrayBlobType")
private byte[] binaryFile;

最佳答案

此字段映射在 org.hibernate.dialect.PostgreSQLDialect 中定义,可以通过对其进行子类化并将您的应用配置为在与 postgres 一起运行时使用修改后的方言来更改。

子类中的相关咒语大概是放

    registerColumnType( Types.BLOB, "bytea" );

在调用 super() 之后在您的构造函数中。

关于 hibernate ,PostgreSQL : Column "x" is of type oid but expression is of type byte,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4488693/

相关文章:

java - JPA 一对多关系的 toString() 函数引发 StackOverflowError

Spring Transactional 注解,Hibernate 和 persist

java - 使用 Spring 的 NamedParamterJdbcTemplate 和命名参数进行分组

java - 将 Java 对象映射到 @XmlElement 值

java - 我必须删除@Override 注释吗?

java - 如果属性名称不等于字段名称,则 Jackson @JsonProperty 不起作用

java - 没有 xml 的 Hibernate

Java Hibernate 计数行

mysql - mysql中如何显示一列的最小值并使用同一列的最大值来过滤其他属性?

php - 使用 php 在 postgresql 中截断带约束的表