gpt4 book ai didi

java - BLOB 和 CLOB 的 Hibernate 配置以同时支持 Oracle 和 Postgres

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:53:06 25 4
gpt4 key购买 nike

我们的项目需要同时支持 Oracle 和 Postgres Dbs。并且可能会有更多数据库添加到此列表中。因此,需要针对 BLOB 和 CLOB 数据类型进行与数据库无关的 Hibernate 配置。

虽然 Oracle 可以正常工作:

@Lob
@Column(name="column1")
private String str;

@Lob
@Column(name="column2")
private byte[] bytea;

Postgres 开始提示。

org.springframework.orm.hibernate4.HibernateJdbcException: JDBC exception on Hibernate data access: SQLException for SQL [insert into TABLE_NAME (TABLE_TYPE, TABLE_ID, TABLE_CONTENT_BIN, TABLE_CONTENT_CHAR) values (?, ?, ?, ?)]; SQL state [0A000]; error code [0]; could not insert: [com.project.EntityClass]; nested exception is org.hibernate.exception.GenericJDBCException: could not insert: [com.project.EntityClass]] Caused by: org.hibernate.exception.GenericJDBCException: could not insert: [com.project.EntityClass] at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3144) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3581) at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:104) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:465) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:351) at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350) at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56) at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1258) at org.springframework.orm.hibernate4.SpringSessionSynchronization.beforeCommit(SpringSessionSynchronization.java:104) ... 40 more Caused by: java.sql.SQLFeatureNotSupportedException: Method org.postgresql.jdbc4.Jdbc4PreparedStatement.setCharacterStream(int, Reader, long) is not yet implemented. at org.postgresql.Driver.notImplemented(Driver.java:670) at org.postgresql.jdbc4.AbstractJdbc4Statement.setCharacterStream(AbstractJdbc4Statement.java:116) at org.hibernate.type.descriptor.sql.ClobTypeDescriptor$4$1.doBind(ClobTypeDescriptor.java:124) at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:90) at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:286) at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:281) at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:56) at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2857) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3121) ... 48 more

研究发现人们建议使用 @Type( type = "org.hibernate.type.StringClobType")@Type( type = "org.hibernate.type.二进制类型")。两者都是 Hibernate Annotations。但是,我们打算使用 JPA 注释,这将需要在运行时使用 Hibernate,这在我看来是不必要的。

所以我的问题是,是否有一种方法可以以非常通用的方式处理 BLOB 和 CLOB,这不需要我们为不同的 DB 分支代码,也不需要添加 Hibernate 特定的注释。此外,我们不使用 hibernate 来创建表。

Postgres 版本 - 9.4-1201-jdbc41

Oracle 版本 - 12.1.0.1

hibernate 版本 -4.3.10.Final

最佳答案

由于我没有从这里得到其他答案,所以我想我会发布我为解决问题所做的工作,这可能会对其他人有所帮助。

因为我们没有使用 Hibernate 创建表,所以我在某处读到 hibernate/jpa 可以在没有 @Lob 注释的情况下将字段转换为适当的类型。例如,对于 byte[] 类型的字段,将 postgres 转换为文本,将 oracle 转换为 BLOB。

尝试过并为 Postgres 和 Oracle 工作。 :)

关于java - BLOB 和 CLOB 的 Hibernate 配置以同时支持 Oracle 和 Postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38701073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com