【发布时间】: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