延迟加载在Hibernate一个CLOB
题
有很多人能找到有关这个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)。
老帖子,但只有一个,帮助我,感谢@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,希望帮助初学者。
不隶属于 StackOverflow