byte []에 대한 적절한 최대 절전 모드 주석


120

최대 절전 모드 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를 제대로 수행 할 때까지 기다려야한다고 말하고 싶습니다."

참조 :


이것은 3.6에서 수정 된 것으로 보이지만 3.5.6에 대해서는 확실하지 않습니다. MaterializedBlobType 클래스는 3.5.5> 3.6에서 완전히 다시 작성되었습니다. OID 유형은 이제 구현이 변경되었으므로 작동합니다.
Justin

좋은! 이 재 작성을 추적하는 Jira 문제가 무엇인지 궁금합니다 (재 작성이 더 깊은 변경의 결과 일 수 있음). 가능한 경우 3.5에서 변경 사항을 백 포트하는 것이 좋습니다. 가능하지 않다면 나쁜 소식입니다.
Pascal Thivent

실제로 내 테스트에서 처음으로 오탐 (false positive)이 발생했습니다 (기다렸어야한다는 것을 알았습니다!). 여전히 수정되지 않았으며 버그가 BlobTypeDescriptor로 이동했습니다.
Justin

감사. @Type (type = "org.hibernate.type.BinaryType")은 PDF 파일을 저장하는 테이블에서 저를 위해 일했습니다. Intelligent Converters의 Oracle-To-PostgreSQL을 사용하여 Oracle에서 Postgres로 데이터베이스를 마이그레이션했는데 BLOB에서 BYTEA로 자동으로 변환 및 삽입되었지만 BlobType이 저에게 적합하지 않았습니다.
jmoran

답변:


68

byte [] 속성에 주석을 추가하는 이식 가능한 방법은 무엇입니까?

그것은 당신이 원하는 것에 달려 있습니다. JPA는 주석이없는 byte[]. JPA 2.0 사양에서 :

11.1.6 기본 주석

Basic주석 데이터베이스 컬럼에 매핑의 간단한 형식입니다. Basic주석은 다음과 같은 유형의 불변의 재산 또는 인스턴스 변수에 적용 할 수 있습니다 : 자바 원시, 유형, 원시 타입 래퍼, java.lang.String, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java.sql.Timestamp, byte[],Byte[] , char[], Character[], 열거, 그리고 다른 종류의 것을 구현 Serializable. 섹션 2.8에 설명 된대로 Basic이러한 유형의 영구 필드 및 속성에 대한 주석 사용은 선택 사항입니다. 이러한 필드 또는 속성에 대해 기본 주석이 지정되지 않은 경우 기본 주석의 기본값이 적용됩니다.

그리고 Hibernate는 그것을 "기본적으로"SQL VARBINARY(또는 SQL LONGVARBINARY에 따라Column PostgreSQL이 처리 크기 합니다 bytea.

그러나를 byte[]대형 개체에 저장하려면 @Lob. 사양에서 :

11.1.24 Lob 주석

Lob지속적인 속성 또는 필드가 데이터베이스 지원 대형 오브젝트 유형에 큰 개체로 유지해야하는지 주석 지정합니다. 이식 가능한 응용 프로그램은 Lob데이터베이스 Lob유형에 매핑 할 때 주석을 사용해야합니다 . Lob주석은 주석 기본으로 또는 함께 사용될 수 ElementCollection있는 요소 컬렉션 값 기본 형인 경우 주석. A Lob는 2 진 또는 문자 유형일 수 있습니다. Lob유형은 문자열 및 문자 유형, 물방울 기본값을 제외하고, 지속 필드 또는 속성의 유형에서 유추된다.

그리고 Hibernate는 BLOBPostgreSQL이 oid .

최신 버전의 최대 절전 모드에서이 문제가 해결 되었습니까?

글쎄요, 문제는 정확히 뭔지 모르겠다는 것입니다. 하지만 3.5.x 브랜치에서 3.5.0-Beta-2 (변경 사항이 도입 된 곳) 이후로 아무것도 변경되지 않았다고 말할 수 있습니다.

그러나 HHH-4876 , HHH-4617PostgreSQL 및 BLOB (의 javadoc에 언급 됨) 과 같은 문제에 대한 나의 이해 PostgreSQLDialect는 다음 속성을 설정해야한다는 것입니다.

hibernate.jdbc.use_streams_for_binary=false

oidie byte[]with 를 사용하려면 @Lob( VARBINARYOracle에서 원하는 것이 아니기 때문에 내 이해 입니다). 이거 해봤 어?

대안으로 HHH-4876 은 deprecated PrimitiveByteArrayBlobType를 사용 하여 이전 동작 (Hibernate 3.5 이전)을 얻을 것을 제안합니다 .

참고 문헌

  • JPA 2.0 사양
    • 섹션 2.8 "비 관계 필드 또는 속성에 대한 매핑 기본값"
    • 섹션 11.1.6 "기본 주석"
    • 섹션 11.1.24 "Lob 주석"

자원


OMG,이 질문에 대답하기 시작한 이후로 많이 바뀌 었다는 것을 알고 있습니다. 나중에 모든 변경 사항을 읽고 필요한 경우 변경 사항을 소화 한 후 내 답변을 업데이트합니다.
Pascal Thivent

사양을 보는 것이 좋으므로 최대 절전 모드는 (@Lob + byte [])를 대형 개체 지원 유형에 매핑하는 데 완전히 정확합니다. Postgresql에는 2 개 (bytea 또는 oid)가 있습니다. 그러나 hibernate 3.5가 oid (기본적으로)에 매핑되는 동안 PGSQL 드라이버가 데이터 대신 6 바이트 oid를 반환하는 JDBC getBytes ()를 사용하여 읽습니다. 또한 블로그 작성자가 질문이 제기 된 이후 가장 도움이되는 답변 (블로그에서)을 확인했습니다.
Justin

@Justin 그러나 hibernate 3.5가 oid (기본적으로)에 매핑되는 동안 JDBC getBytes ()를 사용하여 읽습니다. 어떤 PGSQL 드라이버가 데이터 대신 6 바이트 oid를 반환하는지 -사용할 hibernate.jdbc.use_streams_for_binary=false때도 이런 일이 발생 합니까? (지금 Steve가 말한 것을 확인하려고합니다).
Pascal Thivent

속성 파일에 지정하려고하지만 PostgreSQLDialect에는 false를 반환하는 useInputStreamToInsertBlob ()이 있으므로이 속성을 명시 적으로 설정하지 않았기 때문에 내가 있다고 가정합니다.
Justin

이 속성을 true 또는 false로 설정 한 후 런타임 예외가 발생합니다. ERROR : column "signature"is of type bytea but expression is of type oid ". I am using hibernate 3.5.5.Final + PG 8.2 드라이버
Justin

10

O'reilly Enterprise JavaBeans, 3.0의 내용은 다음과 같습니다.

JDBC에는 이러한 매우 큰 개체에 대한 특수 유형이 있습니다. java.sql.Blob 유형은 이진 데이터 를 나타내고 java.sql.Clob은 문자 데이터를 나타냅니다.

여기 PostgreSQLDialect 소스 코드가 있습니다.

public PostgreSQLDialect() {
    super();
    ...
    registerColumnType(Types.VARBINARY, "bytea");
    /**
      * Notice it maps java.sql.Types.BLOB as oid
      */
    registerColumnType(Types.BLOB, "oid");
}

그래서 당신이 할 수있는

다음과 같이 PostgreSQLDialect를 재정의합니다.

public class CustomPostgreSQLDialect extends PostgreSQLDialect {

    public CustomPostgreSQLDialect() {
        super();

        registerColumnType(Types.BLOB, "bytea");
    }
}

이제 사용자 지정 방언을 정의하십시오.

<property name="hibernate.dialect" value="br.com.ar.dialect.CustomPostgreSQLDialect"/>

휴대용 JPA @Lob 주석을 사용하십시오.

@Lob
public byte[] getValueBuffer() {

최신 정보

여기는 여기에서 추출 되었습니다

최대 절전 모드 3.3.2 에서 실행중인 응용 프로그램이 있고 응용 프로그램은 oid (java의 byte [])를 사용하는 모든 blob 필드와 함께 잘 작동합니다 .

...

최대 절전 모드 3.5로 마이그레이션하면 모든 blob 필드가 더 이상 작동하지 않으며 서버 로그에 다음이 표시됩니다. ERROR org.hibernate.util.JDBCExceptionReporter-ERROR : column is of type oid but expression is of type bytea

여기에서 설명 할 수 있습니다 .

이 generaly는 PG JDBC에서 버그가 아닙니다 , 하지만 3.5 버전에서는 최대 절전 모드의 기본 구현의 변화 . 내 상황 에서 연결에 대한 호환 속성을 설정하는 데 도움이되지 않았습니다 .

...

3.5-베타 2에서 본 것보다 훨씬 더 많으며 이것이 수정되었는지 여부는 @Type 주석이없는 Hibernate인지 모르겠습니다 .oid 유형의 열을 자동 생성하지만 이것을 bytea로 읽으려고 시도합니다.

흥미로운 것은 그가 Types.BOLB를 bytea로 매핑 할 때 (CustomPostgreSQLDialect 참조) 그는

JDBC 일괄 업데이트를 실행할 수 없습니다.

삽입 또는 업데이트 할 때


이 솔루션은 훌륭해 보입니다. 지금 시도하고 있습니다.
Justin

이것은 올바른 DDL을 생성하지만 런타임에 실패합니다. blob 속성이있는 객체를 시도 할 때 java.sql.BatchUpdateException이 발생합니다.
Justin

@Justin PostgreSQL 대신 Oracle을 사용하여 유사한 시나리오를 시도하고 결과를 확인하십시오. BatchUpdateException은 일괄 업데이트 작업 중에 발생하는 오류와 관련이 있습니다.
Arthur Ronald

실제로 내가 원하는 것은 BLOB를 "bytea"에 매핑하는 것이 아니라 (byte [] + @Lob) 주석 조합을 Types.VARBINARY에 매핑하는 것입니다!
Justin


7

Postgres 9.3과 함께 Hibernate 4.2.7.SP1을 사용하고 있으며 다음 작업을 수행합니다.

@Entity
public class ConfigAttribute {
  @Lob
  public byte[] getValueBuffer() {
    return m_valueBuffer;
  }
}

Oracle에는 문제가 없으며 Postgres의 경우 사용자 지정 방언을 사용하고 있습니다.

public class PostgreSQLDialectCustom extends PostgreSQL82Dialect {

    @Override
    public SqlTypeDescriptor remapSqlTypeDescriptor(SqlTypeDescriptor sqlTypeDescriptor) {
    if (sqlTypeDescriptor.getSqlType() == java.sql.Types.BLOB) {
      return BinaryTypeDescriptor.INSTANCE;
    }
    return super.remapSqlTypeDescriptor(sqlTypeDescriptor);
  }
}

이 솔루션의 장점은 최대 절전 모드 항아리를 그대로 유지할 수 있다는 것입니다.

Hibernate와의 Postgres / Oracle 호환성 문제에 대해서는 내 블로그 게시물을 참조하십시오 .


2
Postgresql9Dialect를 확장하여 Hibernate 4.3.6 및 Postgresql 9.3을 사용하여 나를 위해 일했습니다. 감사합니다!
Andrés Oviedo 2014

Hibernate 5.3.7.Final 및 Postgres95Dialect에서 작동합니다. Thx
Bernhard Kern

6

나는 마침내이 일을했습니다. A. Garcia의 솔루션을 확장하지만 문제는 최대 절전 모드 MaterializedBlob 유형에 있기 때문에 Blob> bytea를 매핑하는 것만으로는 충분하지 않으므로 깨어진 Blob 지원을 최대 절전 모드로 전환하는 MaterializedBlobType을 대체해야합니다. 이 구현은 bytea에서만 작동하지만 OID를 원하는 JIRA 문제의 사람이 OID 구현에 기여할 수 있습니다.

슬프게도 런타임에 이러한 유형을 교체하는 것은 Dialect의 일부 여야하므로 고통입니다. 경우에만 이 JIRA의 enhanement가 3.6에 들어간 것이 가능하다.

public class PostgresqlMateralizedBlobType extends AbstractSingleColumnStandardBasicType<byte[]> {
 public static final PostgresqlMateralizedBlobType INSTANCE = new PostgresqlMateralizedBlobType();

 public PostgresqlMateralizedBlobType() {
  super( PostgresqlBlobTypeDescriptor.INSTANCE, PrimitiveByteArrayTypeDescriptor.INSTANCE );
 }

  public String getName() {
   return "materialized_blob";
  }
}

이것의 대부분은 아마도 정적 일 수 있지만 (getBinder () 정말 새 인스턴스가 필요합니까?)하지만 나는 실제로 최대 절전 모드를 이해하지 못하므로 대부분 복사 + 붙여 넣기 + 수정입니다.

public class PostgresqlBlobTypeDescriptor extends BlobTypeDescriptor implements SqlTypeDescriptor {
  public static final BlobTypeDescriptor INSTANCE = new PostgresqlBlobTypeDescriptor();

  public <X> ValueBinder<X> getBinder(final JavaTypeDescriptor<X> javaTypeDescriptor) {
   return new PostgresqlBlobBinder<X>(javaTypeDescriptor, this);
  }
  public <X> ValueExtractor<X> getExtractor(final JavaTypeDescriptor<X> javaTypeDescriptor) {
   return new BasicExtractor<X>( javaTypeDescriptor, this ) {
    protected X doExtract(ResultSet rs, String name, WrapperOptions options) throws SQLException { 
      return (X)rs.getBytes(name);
    }
   };
  }
}

public class PostgresqlBlobBinder<J> implements ValueBinder<J> {
 private final JavaTypeDescriptor<J> javaDescriptor;
 private final SqlTypeDescriptor sqlDescriptor;

 public PostgresqlBlobBinder(JavaTypeDescriptor<J> javaDescriptor, SqlTypeDescriptor sqlDescriptor) { 
  this.javaDescriptor = javaDescriptor; this.sqlDescriptor = sqlDescriptor;
 }  
 ...
 public final void bind(PreparedStatement st, J value, int index, WrapperOptions options) 
 throws SQLException {
  st.setBytes(index, (byte[])value);
 }
}

연구에 +1. 축하합니다. 조언 : 자신의 질문 / 답변을 최대 8 번 수정하는 것을 선호합니다. 그렇지 않으면 질문 / 답변 이 커뮤니티 위키가되고 평판을 얻지 못하고 UP 투표가 더 이상 계산되지 않습니다
Arthur Ronald

테스트 환경에서 한 가지 또는 다른 작업을 계속하는 것을 잊었 기 때문에 내가 생각하기에 너무 많은 편집이 있었다고 생각합니다.
Justin

여기도 마찬가지입니다. 연구에 +1하고 상황에 대한 솔루션을 제공합니다.
Pascal Thivent

4.2.x Hibernate 버전의 솔루션을위한 기회가 있습니까? Hibernate 내부가 약간 변경되었습니다 (문제에 대해 언급했습니다 : hibernate.atlassian.net/browse/HHH-5584 ).
Peter Butkovic 2013

2

나는 oracle에서 blob으로 byte []를 생성하는 @Lob의 주석을 추가하여 내 문제를 해결했지만,이 주석은 제대로 작동하지 않는 oid로 필드를 생성합니다. bytea로 생성 된 byte []를 만들기 위해 고객 Dialect를 위해 아래와 같이 postgres

Public class PostgreSQLDialectCustom extends PostgreSQL82Dialect {
    public PostgreSQLDialectCustom() {
        System.out.println("Init PostgreSQLDialectCustom");
        registerColumnType( Types.BLOB, "bytea" );

      }

    @Override
    public SqlTypeDescriptor remapSqlTypeDescriptor(SqlTypeDescriptor sqlTypeDescriptor) {
    if (sqlTypeDescriptor.getSqlType() == java.sql.Types.BLOB) {
      return BinaryTypeDescriptor.INSTANCE;
    }
    return super.remapSqlTypeDescriptor(sqlTypeDescriptor);
  }
 }

또한 Dialect에 대한 매개 변수를 재정의해야합니다.

spring.jpa.properties.hibernate.dialect = com.ntg.common.DBCompatibilityHelper.PostgreSQLDialectCustom

더 많은 힌트를 찾을 수 있습니다 : https://dzone.com/articles/postgres-and-oracle


0

Postgres 용 XML 파일로 주석을 재정 의하여 작동합니다. Oracle에 대한 주석이 유지됩니다. 제 생각에는이 경우 xml 매핑을 사용하여이 문제가되는 개체의 매핑을 재정의하는 것이 가장 좋습니다. xml 매핑을 사용하여 단일 / 다중 엔티티를 재정의 할 수 있습니다. 따라서 주로 지원되는 데이터베이스에는 주석을 사용하고 서로 데이터베이스에는 xml 파일을 사용합니다.

참고 : 하나의 단일 클래스 만 재정의하면되므로 큰 문제는 아닙니다. XML로 주석을 재정의하는 예제 예제 에서 자세히 알아보십시오.


0

Postgres에서 @Lob은 byte []에 대해 oid로 저장하려고 할 때 중단되며 String의 경우에도 동일한 문제가 발생합니다. 아래 코드는 oracle에서 잘 작동하는 postgres에서 중단됩니다.

@Lob
private String stringField;

@Lob
private byte[]   someByteStream;

postgres에서 위를 수정하기 위해 사용자 정의 hibernate.dialect 아래에 작성했습니다.

public class PostgreSQLDialectCustom extends PostgreSQL82Dialect{

public PostgreSQLDialectCustom()
{
    super();
    registerColumnType(Types.BLOB, "bytea");
}

 @Override
 public SqlTypeDescriptor remapSqlTypeDescriptor(SqlTypeDescriptor sqlTypeDescriptor) {
    if (Types.CLOB == sqlTypeDescriptor.getSqlType()) {
      return LongVarcharTypeDescriptor.INSTANCE;
    }
    return super.remapSqlTypeDescriptor(sqlTypeDescriptor);
  }
}

이제 최대 절전 모드에서 사용자 지정 언어 구성

hibernate.dialect=X.Y.Z.PostgreSQLDialectCustom   

XYZ는 패키지 이름입니다.

이제 잘 작동합니다. 참고-내 Hibernate 버전-5.2.8. 최종 Postgres 버전-9.6.3


0

저를 올바른 방향으로 안내 해준 저스틴, 파스칼에게 감사드립니다. Hibernate 3.5.3에서도 동일한 문제에 직면했습니다. 귀하의 연구와 올바른 수업에 대한 조언은 문제를 식별하고 수정하는 데 도움이되었습니다.

Hibernate 3.5를 계속 사용하고 oid + byte [] + @LoB 조합을 사용하는 사람들을위한 이점을 위해 다음은 문제를 해결하기 위해 수행 한 작업입니다.

  1. MaterializedBlobType을 확장하고 oid 스타일 액세스로 set 및 get 메서드를 재정의하는 사용자 지정 BlobType을 만들었습니다.

    public class CustomBlobType extends MaterializedBlobType {
    
    private static final String POSTGRESQL_DIALECT = PostgreSQLDialect.class.getName();
    
    /**
     * Currently set dialect.
     */
    private String dialect = hibernateConfiguration.getProperty(Environment.DIALECT);
    
    /*
     * (non-Javadoc)
     * @see org.hibernate.type.AbstractBynaryType#set(java.sql.PreparedStatement, java.lang.Object, int)
     */
    @Override
    public void set(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
        byte[] internalValue = toInternalFormat(value);
    
        if (POSTGRESQL_DIALECT.equals(dialect)) {
            try {
    
    //I had access to sessionFactory through a custom sessionFactory wrapper.
    st.setBlob(index, Hibernate.createBlob(internalValue, sessionFactory.getCurrentSession()));
                } catch (SystemException e) {
                    throw new HibernateException(e);
                }
            } else {
                st.setBytes(index, internalValue);
            }
        }
    
    /*
     * (non-Javadoc)
     * @see org.hibernate.type.AbstractBynaryType#get(java.sql.ResultSet, java.lang.String)
     */
    @Override
    public Object get(ResultSet rs, String name) throws HibernateException, SQLException {
        Blob blob = rs.getBlob(name);
        if (rs.wasNull()) {
            return null;
        }
        int length = (int) blob.length();
        return toExternalFormat(blob.getBytes(1, length));
      }
    }
    1. Hibernate에 CustomBlobType을 등록합니다. 다음은 그것을 달성하기 위해 내가 한 일입니다.

      hibernateConfiguration= new AnnotationConfiguration();
      Mappings mappings = hibernateConfiguration.createMappings();
      mappings.addTypeDef("materialized_blob", "x.y.z.BlobType", null);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.