有很多人能找到有关这个google搜索一下,但我还没有遇不到一个可行的解决这个问题。

基本上我有什么是我想要的需求,加载了一个特定类大CLOB。用简单的方式来做到这一点是:

class MyType {

  // ...

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

这不工作,虽然,显然是由于我使用的Oracle司机的事实,即高吊球对象不被视为简单的手感,但是总是被载入。或者说,我一直在率领我的突袭相信。有一个使用专用仪器仪表懒加载特性的一个解决方案,但随着休眠的文档似乎表明他们是小于感兴趣的是该项工作正常,所以我宁愿不走这条路。特别是与具有运行一个额外的编译通和所有

因此,我曾设想在未来的溶液中分离出此对象为另一种类型,并限定的关联。不幸的是,当文档就给矛盾的信息,这是显而易见的,我认为延迟加载不上OneToOne协会与共享主键工作。我设置的关联为多对一的一面,但我不太清楚如何做到这一点时,有一个共享的主键。

所以,任何人可以建议最好的方式去吗?

有帮助吗?

解决方案

根据仅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;
    }
}

其他提示

而不是做与休眠注释equilibristics的,一个可能只是尝试从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);  
} 
为我工作(场开始懒惰地加载,在Oracle)。

既然你似乎是使用Hibernate我不知道你的问题是与以下休眠功能:

使用延迟属性撷取

  

Hibernate3的支持个别属性的延迟抓取。这个   优化技术也被称为取出组。请注意,   这主要是市场特性。优化行读取得多   重要的不是列的优化读取。然而,只有装   一类的一些属性可能是在极端情况下是有用的。对于   例如在原有表中拥有几百列数据   模型不能被改善。

     

懒属性加载的需要编译字节码的即可。如果   你的持久化类没有增强,Hibernate会忽略懒   属性设置和返回其直接载入。

请参阅对Hibernate使用Maven 字节码装置。

老帖子,但只有一个,帮助我,感谢@TadeuszKopec答案。

看起来它是很难做到的斑点的延迟加载与JPA。我试过@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  .....
}

只要记住冲洗父,节省团块之前:

 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,希望帮助初学者。

scroll top