【问题标题】:Hibernate configuration for BLOB and CLOB to support both Oracle and PostgresBLOB 和 CLOB 的休眠配置以支持 Oracle 和 Postgres
【发布时间】:2016-08-01 14:12:00
【问题描述】:

我们的项目需要同时支持 Oracle 和 Postgres Dbs。并且可能有更多的数据库添加到此列表中。所以需要一个用于 BLOB 和 CLOB 数据类型的与 DB 无关的 Hibernate 配置。

当 Oracle 工作正常时:

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

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

Postgres 也开始抱怨。

org.springframework.orm.hibernate4.HibernateJdbcException:Hibernate 数据访问的 JDBC 异常:SQL 的 SQLException [插入 TABLE_NAME (TABLE_TYPE, TABLE_ID, TABLE_CONTENT_BIN, TABLE_CONTENT_CHAR) 值 (?, ?, ?, ?)]; SQL状态[0A000];错误代码[0];无法插入:[com.project.EntityClass];嵌套异常是 org.hibernate.exception.GenericJDBCException:无法插入:[com.project.EntityClass]] 引起:org.hibernate.exception.GenericJDBCException:无法插入:[com.project.EntityClass] 在 org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) 在 org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3144) 在 org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3581) 在 org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:104) 在 org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:465) 在 org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:351) 在 org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350) 在 org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56) 在 org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1258) 在 org.springframework.orm.hibernate4.SpringSessionSynchronization.beforeCommit(SpringSessionSynchronization.java:104) ... 40 更多 原因:java.sql.SQLFeatureNotSupportedException:方法 org.postgresql.jdbc4.Jdbc4PreparedStatement.setCharacterStream(int, Reader, long) 尚未实现。 在 org.postgresql.Driver.notImplemented(Driver.java:670) 在 org.postgresql.jdbc4.AbstractJdbc4Statement.setCharacterStream(AbstractJdbc4Statement.java:116) 在 org.hibernate.type.descriptor.sql.ClobTypeDescriptor$4$1.doBind(ClobTypeDescriptor.java:124) 在 org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:90) 在 org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:286) 在 org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:281) 在 org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:56) 在 org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2857) 在 org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3121) ... 48 更多

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

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

Postgres 版本 - 9.4-1201-jdbc41

Oracle 版本 - 12.1.0.1

休眠版本-4.3.10.Final

【问题讨论】:

  • 与其他 JPA 提供者一样,你可以在那里做。也许当你说某事是“抱怨”时,也许更好地提及 WHAT 消息 + 堆栈跟踪
  • @NeilStockton:添加了消息和堆栈跟踪。请帮忙

标签: java oracle hibernate jpa postgresql-9.1


【解决方案1】:

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

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

对此进行了尝试,并为 Postgres 和 Oracle 工作。 :)

【讨论】:

  • 太棒了,两岁了,但仍然有效。
猜你喜欢
  • 1970-01-01
  • 2017-09-30
  • 2014-04-14
  • 2014-05-08
  • 2011-08-24
  • 2014-12-23
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多