首页 > 解决方案 > 如何在 Hibernate ORM 中将“lo”别名为“oid”?

问题描述

在 Postgres 10 中,我将该lo模块用于我的大对象字段。这将创建一个自定义类型lo,它是oid. 但是,我无法弄清楚如何让 Hibernate 5.3 知道这一点。

CREATE EXTENSION lo;
CREATE TABLE foo (
    bigserial id PRIMARY KEY,
    bar lo
);
@lombok.Data
@javax.persistence.Entity
public class Foo {
    @javax.persistence.Id
    private long id;

    @javax.persistence.Lob
    private java.sql.Blob bar;
}

org.hibernate.tool.schema.spi.SchemaManagementException:模式验证:在表 [foo] 的列 [bar] 中遇到错误的列类型;找到 [lo (Types#DISTINCT)],但期待 [oid (Types#BLOB)]

标签: javapostgresqlhibernatejpaspring-data-jpa

解决方案


您可以使用自定义方言来执行此操作,但这需要手动指定它而不是允许自动检测。

package com.example

public class CustomDialect extends PostgreSQL95Dialect {
    public CustomDialect () {
        this.registerColumnType(Types.BLOB, "lo");
    }
}
hibernate.dialect=com.example.CustomDialect

如果类型是模式限定的而不是依赖于搜索路径,这会变得更加复杂。您将需要注册,例如"\"public\".\"lo\""


您可以使用自定义DialectResolver来仅替换检测到的 postgres 方言,但如果您想支持多个版本,您将需要很多类:CustomPostgreSQL95DialectCustomPostgreSQL94Dialect等。

package com.example

public class CustomDialectResolver extends BasicDialectResolver {
    public CustomDialectResolver() {
        super("PostgreSQL", CustomDialect.class);
    }
}
hibernate.dialect_resolvers=com.example.CustomDialectResolver

推荐阅读