BLOB和CLOB的Hibernate配置,以支持Oracle和Postgres

时间:2016-08-01 14:12:00

标签: java oracle hibernate jpa postgresql-9.1

我们的项目需要同时支持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

1 个答案:

答案 0 :(得分:0)

由于我从这里得不到其他答案,我以为我会发布我已经做过的事情来解决我的问题,这可能对其他人有帮助。

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

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