2016-08-01 96 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工作。 :)