최대 절전 모드 3.1 및 JPA 주석을 사용하는 응용 프로그램이 있습니다. byte [] 속성 (1k-200k 크기)을 가진 몇 개의 객체가 있습니다. JPA @Lob 주석을 사용하고 hibernate 3.1은 모든 주요 데이터베이스에서 잘 읽을 수 있습니다. JDBC Blob 공급 업체의 특성을 숨기는 것 같습니다 (해야하는 것처럼).
@Entity
public class ConfigAttribute {
@Lob
public byte[] getValueBuffer() {
return m_valueBuffer;
}
}
최대 절전 모드 3.5 가 postgresql에서이 주석 조합을 중단 (해결하지 않음) 하는 것을 발견했을 때 3.5로 업그레이드해야 했습니다 (해결 방법 없음). 지금까지 명확한 수정 사항을 찾지 못했지만 @Lob을 제거하면 postgresql 유형 bytea를 사용한다는 것을 알았습니다 (작동하지만 postgres에서만).
annotation postgres oracle works on
-------------------------------------------------------------
byte[] + @Lob oid blob oracle
byte[] bytea raw(255) postgresql
byte[] + @Type(PBA) oid blob oracle
byte[] + @Type(BT) bytea blob postgresql
once you use @Type, @Lob seems to not be relevant
note: oracle seems to have deprecated the "raw" type since 8i.
주요 데이터베이스에서 이식 가능한 단일 주석 처리 된 클래스 (blob 속성 포함)를 갖는 방법을 찾고 있습니다.
- byte [] 속성에 주석을 추가하는 이식 가능한 방법은 무엇입니까?
- 최신 버전의 최대 절전 모드에서이 문제가 해결 되었습니까?
업데이트 : 이 블로그를 읽은 후 마침내 JIRA 문제의 원래 해결 방법이 무엇인지 알아 냈습니다. 분명히 @Lob을 삭제하고 속성에 다음과 같이 주석을 달아야합니다.
@Type(type="org.hibernate.type.PrimitiveByteArrayBlobType")
byte[] getValueBuffer() {...
그러나 이것은 나를 위해 작동하지 않습니다 . -나는 여전히 bytea 대신 OID를 얻습니다. 그러나 OID를 원하는 것처럼 보였던 JIRA 문제의 저자에게는 작동했습니다.
A. Garcia의 답변을받은 후이 콤보를 사용해 보았습니다. 실제로 postgresql에서는 작동하지만 oracle에서는 작동하지 않습니다.
@Type(type="org.hibernate.type.BinaryType")
byte[] getValueBuffer() {...
내가 정말로해야 할 일은 @ org.hibernate.annotations.Type (@Lob + byte []가 매핑되는) 조합을 (postgresql에서) 제어하는 것입니다.
다음은 MaterializedBlobType (sql 유형 Blob)의 3.5.5.Final 코드입니다. Steve의 블로그에 따르면 postgresql은 bytea (이유는 묻지 마세요)에 Streams를 사용하고 OID에 대해서는 postgresql의 사용자 지정 Blob 유형을 사용하기를 원합니다. 또한 JDBC에서 setBytes ()를 사용하는 것은 (과거 경험에서) bytea를위한 것이기도합니다. 그래서 이것은 유즈 스트림이 왜 'bytea'를 가정하는 데 영향을 미치지 않는지 설명합니다.
public void set(PreparedStatement st, Object value, int index) {
byte[] internalValue = toInternalFormat( value );
if ( Environment.useStreamsForBinary() ) {
// use streams = true
st.setBinaryStream( index,
new ByteArrayInputStream( internalValue ), internalValue.length );
}
else {
// use streams = false
st.setBytes( index, internalValue );
}
}
결과는 다음과 같습니다.
ERROR: column "signature" is of type oid but expression is of type bytea
업데이트 다음 논리적 질문은 "테이블 정의를 수동으로 bytea로 변경하지 않는 이유"이며 (@Lob + byte [])를 유지합니까? 이것은 수행 , 작업을 UNTIL 당신은 [] 널 바이트를 저장하려고합니다. postgreSQL 드라이버가 OID 유형 표현식이라고 생각하고 열 유형은 bytea입니다. 이것은 최대 절전 모드 (올바르게)가 PG 드라이버가 예상하는 JDBC.setBytes (null) 대신 JDBC.setNull ()을 호출하기 때문입니다.
ERROR: column "signature" is of type bytea but expression is of type oid
최대 절전 모드의 유형 시스템은 현재 '작업 중'입니다 (3.5.5 deprecation 주석에 따름). 실제로 3.5.5 코드의 많은 부분이 더 이상 사용되지 않으므로 PostgreSQLDialect를 하위 클래스화할 때 무엇을 살펴 봐야하는지 알기 어렵습니다.
postgresql의 AFAKT, Types.BLOB / 'oid'는 OID 스타일 JDBC 액세스 (예 : PostgresqlBlobType 객체 및 NOT MaterializedBlobType)를 사용하는 일부 사용자 정의 유형에 매핑되어야합니다. 나는 실제로 postgresql과 함께 Blob을 성공적으로 사용한 적이 없지만 bytea는 단순히 하나로 작동한다는 것을 알고 있습니다.
현재 BatchUpdateException을보고 있습니다. 드라이버가 일괄 처리를 지원하지 않을 수 있습니다.
2004 년의 위대한 인용문 : "내 말을 요약하자면, Hibernate를 변경하기 전에 JDBC 드라이버가 LOB를 제대로 수행 할 때까지 기다려야한다고 말하고 싶습니다."
참조 :
- https://forum.hibernate.org/viewtopic.php?p=2393203
- https://forum.hibernate.org/viewtopic.php?p=2435174
- http://hibernate.atlassian.net/browse/HHH-4617
- http://postgresql.1045698.n5.nabble.com/Migration-to-Hibernate-3-5-final-td2175339.html
- https://jira.springframework.org/browse/SPR-2318
- https://forums.hibernate.org/viewtopic.php?p=2203382&sid=b526a17d9cf60a80f13d40cf8082aafd
- http://virgo47.wordpress.com/2008/06/13/jpa-postgresql-and-bytea-vs-oid-type/