문제

이 인터넷 검색에 대해 조금만 찾을 수있는 것이 많지만이 문제에 대한 실행 가능한 솔루션을 찾지 못했습니다.

기본적으로 내가 가진 것은 주문에 적재하고 싶은 특정 클래스의 큰 덩어리입니다. 순진한 방법은 다음과 같습니다.

class MyType {

  // ...

  @Basic(fetch=FetchType.LAZY)
  @Lob
  public String getBlob() {
    return blob;
  }
}

그래도 Oracle 드라이버를 사용하고 있다는 사실 때문에 작동하지 않습니다. 즉, LOB 객체는 간단한 핸들로 취급되지 않지만 항상로드됩니다. 또는 나는 내 진출을 믿게되었습니다. 게으른 속성 로딩을 위해 특수 계측을 사용하는 솔루션이 하나 있지만, 최대 절전 모드 문서가 올바르게 작동하는 데 관심이없는 것 같아서 그 경로를 가지 않기를 원합니다. 특히 추가 컴파일 패스를 실행해야합니다.

그래서 내가 상상했던 다음 해결책은이 개체를 다른 유형으로 분리하고 연관성을 정의하는 것이 었습니다. 불행히도, 문서는 상충되는 정보를 제공하지만, 게으른 로딩은 공유 기본 키와 OnetoOne의 연관성에서 작동하지 않는다는 것이 분명합니다. 나는 협회의 한쪽을 많은 사람들로 설정했지만, 1 차 키가 공유 될 때 어떻게 해야할지 잘 모르겠습니다.

그렇다면 아무도 이것에 대해 가장 좋은 방법을 제안 할 수 있습니까?

도움이 되었습니까?

해결책

에 따르면 이것 Postgresql만이 Blob을 정말 게으른 것으로 구현합니다. 따라서 최상의 솔루션은 블로브를 다른 테이블로 옮기는 것입니다. 공유 기본 키를 사용해야합니까? 왜 다음과 같은 일을하지 않겠습니까?

public class MyBlobWrapper {
    @Id
    public Long getId() {
       return id;
    }
    @Lob
    public String getBlob() {
        return blob;
    }
    @OneToOne(fetch=FetchType.LAZY,optional=false) 
    public MyClass getParent() {
        return parent;
    }
}

다른 팁

최대 절전 모드 주석으로 평형을 수행하는 대신 필드를 String ~ 안으로 Clob (또는 Blob):

@Lob  
@Basic(fetch=FetchType.LAZY)  
@Column(name = "FIELD_COLUMN")  
public Clob getFieldClob() {  
  return fieldClob;  
}  

public void setFieldClob(Clob fieldClob) {  
  this.fieldClob = fieldClob;  
}  

@Transient  
public String getField()  
{  
  if (this.getFieldClob()==null){  
    return null;  
  }  
  try {  
    return MyOwnUtils.readStream(this.getFieldClob().getCharacterStream());  
  } catch (Exception e) {  
    e.printStackTrace();  
  }  

  return null;  
}  

public void setField(String field)  
{  
  this.fieldClob = Hibernate.createClob(field);  
} 

나를 위해 일했습니다 (필드는 오라클에서 게으르게 적재하기 시작했습니다).

최대 절전 모드를 사용하는 것처럼 보이므로 문제가 다음 최대 절전 모드 기능과 관련이 있는지 궁금합니다.

게으른 속성을 사용하여 가져 오기

Hibernate3은 개별 특성의 게으른 페치를 지원합니다. 이 최적화 기술은 페치 그룹이라고도합니다. 이것은 대부분 마케팅 기능입니다. 행 읽기 최적화는 열 읽기 최적화보다 훨씬 중요합니다. 그러나 클래스의 일부 속성을로드하는 것은 극단적 인 경우에 유용 할 수 있습니다. 예를 들어, 레거시 테이블에 수백 개의 열이 있고 데이터 모델을 개선 할 수없는 경우.

게으른 속성 로딩 빌드 타임 바이트 코드 계측이 필요합니다. 지속적인 클래스가 향상되지 않으면 최대 절전 모드는 게으른 속성 설정을 무시하고 즉각적인 페치로 돌아갑니다.

보다 Maven을 사용한 최대 절전 모드를위한 바이트 코드 계측.

@TadeUszKopec 답변 덕분에 오래된 게시물이지만 저를 도와 준 사람 만 있습니다.

JPA로 Blob을 게으른로드하는 것이 어렵습니다. 나는 @onetoone 협회를 시도했지만 도움보다 더 복잡합니다. 방금 MyClass (부모. 동일한 테이블, 동일한 ID)와 관련이없는 다른 클래스로 바이트를 옮겼습니다.

@Entity
@Table(name="MyTable")
public class MyBlobWrapper{

    @Id
    @Column(name = "id") // id of MyTable, same as MyClass
    private Long id;

    @Lob
    private byte[] bytes;   
}

@Entity
@Table(name="MyTable")
public class MyClass{

    @Id
    @Column(name = "id")
    private Long id;
    // other fields  .....
}

Blob을 저장하기 전에 부모를 플러시하는 것을 잊지 마십시오.

 em.persist(parent);
 em.flush();
 em.merge(new MyBlobWrapper(parent_id,new byte[1000]));

이제 PDF 만로드 할 수 있습니다.

String query1 = " select PDF from MyBlobWrapper PDF where PDF.id = :id";

저는 JPA의 초보자입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top