如何使 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
中为每个数据库使用合适的驱动程序?
当然。我有单独的配置文件进行配置。驱动程序和oracle
和postgresql
存在依赖关系。
嗯.. 尝试将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 上工作?的主要内容,如果未能解决你的问题,请参考以下文章