如何使 BLOB 在 Oracle 和 PostgreSQL 上工作?

Posted

技术标签:

【中文标题】如何使 BLOB 在 Oracle 和 PostgreSQL 上工作?【英文标题】:How to make BLOB work on Oracle and PostgreSQL? 【发布时间】:2019-03-28 20:07:00 【问题描述】:

我有一个带有BLOB 列的实体:

@Lob
@Column(name = "SRC")
private byte[] src;

我的应用程序使用两个数据库,Oracle 和 PostgreSQL。当我用上面写的 Oracle 启动应用程序时,一切正常,但是当我用 PostgreSQL 启动时,我得到一个错误:

Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [src] in table [catalogs]; found [bytea (Types#BINARY)], but expecting [oid (Types#BLOB)]

之后,我阅读了 Google 中的文章和建议并进行了修复:

@Lob
@Type(type="org.hibernate.type.BinaryType")
@Column(name = "SRC")
private byte[] src;

现在它在 PostgreSQL 上运行良好,但在 Oracle 上却出现异常:

Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [src] in table [catalogs]; found [blob (Types#BLOB)], but expecting [raw(255) (Types#VARBINARY)]

我应该怎么做才能使它在两个数据库上都工作?

附:我对 CLOB 也有类似的问题

【问题讨论】:

您是否在DataSource / JPA configuration 中为每个数据库使用合适的驱动程序? 当然。我有单独的配置文件进行配置。驱动程序和oraclepostgresql 存在依赖关系。 嗯.. 尝试将columnDefinition = "VARBINARY" 属性添加到您的@Column 注释中,然后检查发生了什么。做两种情况:有和没有@Type注解。 没有帮助 【参考方案1】:

你的 sql 类型应该是:bytea(Postgres 数据库)

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:

不幸的是,休眠实体是特定于 db-provider 的。

【讨论】:

承诺的数据库独立性就这么多。这在 JDBC 级别上非常容易处理,那么为什么 Hibernate 不能这样做呢? @a_horse_with_no_name 是的,hibernate 本身是独立的。我猜想 JDBC 使实体类在这里不合作。您可以编写一个包装器驱动程序,将 postgres 驱动程序包装为具有类似 oracle 的行为,以便使用 oracle-style-hibernate-entity-classes(反之亦然,为 oracle-driver 提供类似 postgres 的行为的包装器)为了使用 postgres-style-hibernate-entity-classes)。

以上是关于如何使 BLOB 在 Oracle 和 PostgreSQL 上工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中读取oracle blob

如何在oracle中的blob字段下读取jpg格式文件保存

如何在oracle中的blob字段下读取jpg格式文件保存

oracle 如何将字段类型varchar 改为blob 更改提示数据类型的变更无效

如何从 oracle db 查看 BLOB 文件

oracle数据库之如何将blob类型转换为varchar2