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

Igo*_*hin 5 java orm jpa eclipselink jpql

假设我们有一个实体

@Entity
public class Person {
    @Id int id;
    @Basic String name;
    @Basic String remark;
}
Run Code Online (Sandbox Code Playgroud)

让我们说"评论"字段填充大文本,但很少使用.因此,当你运行jpql:时SELECT p FROM Person p,EclipseLink只会执行sqlselect id, name from person

而且当你打电话时person.getRemark(),它会被取出select remark from person where id = ?.

是否可以使用EclipseLink 2.1?

Pas*_*ent 5

您确实可以在一个fetch属性中定义一个属性Basic注释中并将其设置为LAZY. 但是让我引用规范中的内容:

11.1.6 基本注解

(……)

EAGER策略是对持久性提供程序运行时的一项要求,即必须急切地获取数据。 LAZY策略是对持久性提供程序运行时的一个提示,即在第一次访问数据时应该延迟获取数据。允许实现急切地获取LAZY已为其指定策略提示的数据。特别是,延迟获取可能仅适用于 Basic使用基于属性的访问的映射。

在 EclipseLink 的特殊情况下,行为将取决于上下文(Java EE 与 Java SE),如您可能需要了解的关于 EclipseLink JPA 延迟加载中所述

在 Java EE 环境中(假设容器实现了 EJB 3.0 规范的适当容器契约):

当 fetch 属性设置为 javax.persistence.FetchType.LAZY 时,EclipseLink JPA 执行延迟加载。

在 Java SE 环境中:

默认情况下,EclipseLink JPA 会忽略 fetch 属性并应用默认的 javax.persistence.FetchType.EAGER。

要将 EclipseLink JPA 配置为在 fetch 属性设置为 FetchType.LAZY 时执行延迟加载,请考虑以下情况之一:


nan*_*nda 2

尝试添加注释@Basic(fetch = FetchType.LAZY)

@Entity
public class Person {
    @Id int id;
    @Basic String name;
    @Basic(fetch = FetchType.LAZY) String remark;
}
Run Code Online (Sandbox Code Playgroud)