wds*_*wds 15 java hibernate jpa clob lob
关于这个谷歌搜索有很多人可以找到,但我还没有找到一个可行的解决方案来解决这个问题.
基本上我所拥有的是一个特定类的大型CLOB,我希望按需加载它.这种天真的方式是:
class MyType {
// ...
@Basic(fetch=FetchType.LAZY)
@Lob
public String getBlob() {
return blob;
}
}
Run Code Online (Sandbox Code Playgroud)
这虽然不起作用,显然是因为我使用的是oracle驱动程序,即Lob对象不被视为简单的句柄,但总是被加载.或者我已经被引导相信我的想法.有一种解决方案使用特殊的工具来进行延迟属性加载,但是由于Hibernate文档似乎表明他们对使这项工作正确无益,所以我宁愿不去那条路.特别是必须运行额外的编译通道和所有.
因此,我设想的下一个解决方案是将此对象分离为另一种类型并定义关联.不幸的是,虽然文档提供了相互矛盾的信息,但很明显,延迟加载对OneToOne与共享主键的关联不起作用.我将关联的一方设置为ManyToOne,但是当有共享主键时,我不太确定如何执行此操作.
所以有人能提出最好的解决方法吗?
根据这个,只有PostgreSQL实现Blob真的很懒.所以最好的解决方案是将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;
}
}
Run Code Online (Sandbox Code Playgroud)
可以尝试将字段转换String为Clob(或Blob):而不是使用hibernate注释进行equilibristics :
@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);
}
Run Code Online (Sandbox Code Playgroud)
为我工作(该领域开始懒洋洋地加载,在Oracle上).
| 归档时间: |
|
| 查看次数: |
12652 次 |
| 最近记录: |