2016-08-01 95 views
3

我们的项目需要同时支持Oracle和Postgres Dbs。并且可能会有更多的数据库添加到此列表中。因此,需要针对BLOB和CLOB数据类型的DB不可知的Hibernate配置。用于BLOB和CLOB的休眠配置,以支持Oracle和Postgres

尽管甲骨文正在与罚款:

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

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

的Postgres开始用相同的抱怨。

org.springframework.orm.hibernate4.HibernateJdbcException:Hibernate的数据访问JDBC例外:为的SQLException SQL [(????,,,)插入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] 。 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。插入(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的:2 857) 在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以非常通用的方式,这将不需要我们分支代码为不同的数据库和没有添加Hibernate特定的注释。另外,我们不使用hibernate进行表格创建。

Postgres的版本 - 9.4-1201-jdbc41

Oracle版本 - 12.1.0.1

Hibernate的版本-4.3.10.Final

+0

与其他JPA提供商一样,您可以像在那里一样执行操作。也许当你说什么是“抱怨”时,或许更好的提及什么消息+堆栈跟踪 –

+0

@NeilStockton:添加消息和堆栈跟踪。请帮忙 –

回答

0

因为我从这里没有其他的答案,我想我会发布我已经做了什么来解决我的问题,这可能会帮助他人。

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

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