【问题标题】:How to alias "lo" to "oid" in Hibernate ORM?如何在 Hibernate ORM 中将“lo”别名为“oid”?
【发布时间】:2019-10-03 16:19:31
【问题描述】:

在 Postgres 10 中,我将 lo module 用于我的大型对象字段。这将创建一个自定义类型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: Schema-validation: 在表 [foo] 的列 [bar] 中遇到错误的列类型;找到 [lo (Types#DISTINCT)],但期待 [oid (Types#BLOB)]

【问题讨论】:

    标签: java postgresql hibernate jpa spring-data-jpa


    【解决方案1】:

    您可以使用自定义方言来做到这一点,但这需要手动指定它而不是允许自动检测。

    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
    

    【讨论】:

      猜你喜欢
      • 2014-10-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      相关资源
      最近更新 更多