很遗憾,下面的代码不起作用。图像总是被检索!
@Entity
public Car implements Serializable {
...
@Basic(fetch = FetchType.LAZY) //Neither with @Lob
private byte[] image;
...
}
设置:JPA 2.0 / Hibernate 3.5 / MySQL 5.5
很遗憾,下面的代码不起作用。图像总是被检索!
@Entity
public Car implements Serializable {
...
@Basic(fetch = FetchType.LAZY) //Neither with @Lob
private byte[] image;
...
}
设置:JPA 2.0 / Hibernate 3.5 / MySQL 5.5
public class Attachment implements FieldHandled{
@Transient
private FieldHandler fieldHandler;
...
...
@Lob
@Column(name=CONTENT, nullable=false)
@Basic(fetch = FetchType.LAZY, optional = false)
private byte[] content;
...
...
public byte[] getContent() {
if(fieldHandler!=null){
return (byte[])fieldHandler.readObject(this, "content", content);
}
return content;
}
public void setContent(byte[] content) {
if(fieldHandler!=null){
fieldHandler.writeObject(this, "content", this.content, content);
return;
}
this.content = content;
}
}
@OneToMany (fetch = FetchType.LAZY)
Collection<Employee> employees;
Collection是一个接口,因此JPA可以轻松地使用自己的集合实现,在您开始迭代时懒加载数据。如果您有一个带有byte[]
类型字段的对象,它的值要么为null,要么包含所有数据,这就是Java的工作方式。唯一绕过这个问题的方法是使用类编织并创建字节码,看起来像一个字节数组,但在访问它之前不包含任何数据。
我记得这是一个问题,大约在2007年左右:即为什么字节数组即使被声明为lazy,也会被急切地获取。显然,Hibernate的开发人员仍然没有解决这个问题。
以下是一些可行的替代方案:
首先,尝试使用@Lob
注释您的字段,看看是否按预期工作。
其次,将byte[]
替换为java.sql.Blob
,它具有设置和获取实际字节数组的便捷方法,因此不会进行大规模重构,并且这应该可以解决懒加载问题:
http://download.oracle.com/javase/1.4.2/docs/api/java/sql/Blob.html
@Lob @Basic(fetch = FetchType.LAZY) Blob private byte[] image;
EntityManager无法持久化此属性...持久化所有字段,而image
保持为空。我正在使用具体类SerialBlob
。 - CelinHC