我们的项目需要同时支持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: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) at 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) 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) 在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特定的注释。另外,我们不使用hibernate来创建表。
Postgres版本 - 9.4-1201-jdbc41
Oracle版本 - 12.1.0.1
Hibernate Version -4.3.10.Final
答案 0 :(得分:0)
由于我从这里得不到其他答案,我以为我会发布我已经做过的事情来解决我的问题,这可能对其他人有帮助。
由于我们没有使用Hibernate创建表,我在某处读到了hibernate / jpa能够将字段转换为适当的类型,而不需要@Lob
注释。例如,将postgres转换成文本,将oracle转换为BLOB,转换为byte[]
类型的字段。
尝试过并为Postgres和Oracle工作。 :)