假设我们有一个实体
@Entity
public class Person {
@Id int id;
@Basic String name;
@Basic String remark;
}
让我们说“评论”字段填充大文本,但很少使用。因此,当您运行jpql:SELECT p FROM Person p
时,EclipseLink只执行sql select id, name from person
与您致电person.getRemark()
时相比,它会被select remark from person where id = ?
取走。
是否可以使用EclipseLink 2.1?
答案 0 :(得分:4)
您确实可以在fetch
注释中定义Basic
属性并将其设置为LAZY
。但是,让我引用规范中所说的内容:
11.1.6基本注释
(...)
EAGER
策略是必需的 在持久性提供程序运行时上 必须急切地获取数据。LAZY
策略是对持久性提供程序运行时的提示 数据应该在懒散的时候取出 是第一次访问。实施 被允许急切地获取数据LAZY
策略提示有哪些 已被指定。特别是懒惰 提取可能只适用于Basic
映射 使用基于属性的访问。
在EclipseLink的特定情况下,行为将取决于What You May Need to Know About EclipseLink JPA Lazy Loading中所述的上下文(Java EE与Java SE)。
在Java EE环境中(假设容器实现EJB 3.0规范的适当容器契约):
当fetch属性设置为javax.persistence.FetchType.LAZY时,EclipseLink JPA执行延迟加载。
在Java SE环境中:
默认情况下,EclipseLink JPA忽略了 fetch属性和默认的javax.persistence.FetchType.EAGER适用。
要将fetch属性设置为FetchType.LAZY时配置EclipseLink JPA以执行延迟加载,请考虑以下之一:
答案 1 :(得分:2)
尝试添加注释@Basic(fetch = FetchType.LAZY)
@Entity
public class Person {
@Id int id;
@Basic String name;
@Basic(fetch = FetchType.LAZY) String remark;
}
答案 2 :(得分:1)
我们解决了这个问题(当使用ActiveRecord和Hibernate时)将大字符串(通常是CLOB或BLOB)放入其自己的表中,并将FK放入主表(在本例中为Person)。然后它就像你想要的那样工作