EclipseLink:默认情况下不提取某些字段

时间:2010-10-14 11:29:04

标签: java orm jpa eclipselink jpql

假设我们有一个实体

@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?

3 个答案:

答案 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)。然后它就像你想要的那样工作