Как использовать псевдоним "lo" для "oid" в Hibernate ORM? - PullRequest
4 голосов
/ 16 мая 2019

В 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: проверка схемы: обнаружен неправильный тип столбца в столбце [bar] в таблице [foo]; найдено [lo (Types # DISTINCT)], но ожидается [oid (Types # BLOB)]

1 Ответ

1 голос
/ 17 мая 2019

Вы можете сделать это с помощью пользовательского диалекта, но для этого потребуется указать его вручную, а не разрешить автоопределение.

package com.example

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

Это становится более сложным, если тип квалифицирован схемой, а не полагается на путь поиска. Вам нужно будет зарегистрироваться, например, "\"public\".\"lo\""


Вы можете использовать пользовательский DialectResolver только для замены обнаруженных диалектов postgres, но если вы хотите поддерживать несколько версий, вам понадобится много классов: CustomPostgreSQL95Dialect, CustomPostgreSQL94Dialect и т. Д.

package com.example

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