2016-08-01 3 views
3

우리 프로젝트는 Oracle과 Postgres Dbs를 모두 지원해야합니다. 그리고이 목록에 더 많은 데이터베이스가 추가 될 수 있습니다. 따라서 BLOB 및 CLOB 데이터 유형에 대해 DB를 인식하지 않는 Hibernate 구성이 필요합니다.Oracle과 Postgres를 모두 지원하는 BLOB 및 CLOB에 대한 최대 절전 모드

은 오라클과 잘 작동 동안 :

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

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

포스트 그레스는 같은과 불평하기 시작했다.

org.springframework.orm.hibernate4.HibernateJdbcException : 하이버 네이트 데이터 액세스에 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] 을 (를) 삽입 할 수 없습니다. 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)에서 에서 ActionQueue. java : 465) at org.hibernate.engine.spi.ActionQueue.executeActions (ActionQueue.java:351) at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions (AbstractFlushingEventListener.java:350) at org.hibernate. org.springframework.orm.hibernate4.SpringSessionSynchronization.beforeCommit (SpringSessionSynchronization.java에서 org.hibernate.internal.SessionImpl.flush (SessionImpl.java:1258) 에서 event.internal.DefaultFlushEventListener.onFlush (DefaultFlushEventListener.java:56) : 104) ... 40 more 발생 원인 : java.sql.SQLFeatureNotSupportedException : 메소드 org.postgresql.jdbc4.Jdbc4PreparedStatement.setCharacterStream (int, Reader, long)이 아직 구현되지 않았습니다. org.postgresql.jdbc4.AbstractJdbc4Statement.setCharacterStream에서 org.postgresql.Driver.notImplemented (Driver.java:670) (AbstractJdbc4Statement.java:116)에서 $ 1 항에 org.hibernate.type.descriptor.sql.ClobTypeDescriptor $. doBind org.hibernate.type.AbstractStandardBasicType.nullSafeSet (AbstractStandardBasicType.java:286)에서 (ClobTypeDescriptor.java:124) org.hibernate.type.descriptor.sql.BasicBinder.bind (BasicBinder.java:90)에서 에서 org.hibernate.type.AbstractStandardBasicType.nullSafeSet (AbstractStandardBasicType.java:281) org.hibernate.persister.entity.AbstractEntityPersister.dehydrate에서 org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet (AbstractSingleColumnStandardBasicType.java:56) 에서 (AbstractEntityPersister. 자바 : 2 org.hibernate.persister.entity.AbstractEntityPersister.insert (AbstractEntityPersister.java:3121) 에서 857) ... 48 개

연구하고 사람들이 @Type(type = "org.hibernate.type.StringClobType")@Type(type = "org.hibernate.type.BinaryType")와 주석을 제안하는 것을 발견했다. 둘 다 Hibernate Annotation이다. 그러나 우리는 JPA 어노테이션을 사용하려고하며, 런타임시에는 절전 모드가 필요할 것이므로 불필요하다고 생각합니다.

그래서 내 질문은 우리가 다른 DB에 대한 코드를 분기하고 Hibernate 특정 주석을 추가하지 않아도되는 매우 일반적인 방식으로 BLOB 및 CLOB를 처리하는 방법이 있는지 궁금하다. 또한 테이블 생성을 위해 최대 절전 모드를 사용하지 않습니다.

포스트 그레스 9.4-1201-jdbc41 버전 -

Oracle 버전 - 12.1.0.1

최대 절전 모드 버전 -4.3.10.Final

+0

다른 JPA 제공 업체와 함께하면됩니다. 아마도 무언가가 "불평"하다고 말할 때, 어쩌면 무엇을 언급해야할까요? 메시지 + 스택 추적 –

+0

@NeilStockton : 메시지 및 스택 추적이 추가되었습니다. 도와주세요 –

답변

0

여기에서 다른 답을 가지고 있지 않기 때문에, 나는 생각 다른 사람들에게 도움이 될 수있는 문제를 해결하기 위해 내가 한 일을 게시 할 것입니다.

우리가 Hibernate를 가진 테이블을 생성하지 않았기 때문에 hibernate/jpa가 @Lob 주석이없는 적절한 유형으로 필드를 변환 할 수있는 곳을 읽었습니다. 예를 들어 postgres는 텍스트로, oracle은 BLOB로 필드가 byte[]입니다.

시도해 보았습니다. Postgres와 Oracle 모두에서 작동했습니다. :)