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

Posted

技术标签:

【中文标题】EclipseLink:默认情况下不获取某些字段【英文标题】:EclipseLink: don't fetch some fields by default 【发布时间】:2011-04-25 08:39:45 【问题描述】:

假设我们有一个实体

@Entity
public class Person 
    @Id int id;
    @Basic String name;
    @Basic String remark;

假设“备注”字段充满了大文本,但很少使用。所以如果你运行jpql:SELECT p FROM Person p,EclipseLink只执行sqlselect id, name from person就很好了

当你调用person.getRemark() 时,它会被select remark from person where id = ? 获取。

EclipseLink 2.1 可以吗?

【问题讨论】:

【参考方案1】:

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

11.1.6 基本注解

(...)

EAGER 策略是一项要求 在持久性提供程序运行时 必须急切地获取该数据。 LAZY 策略是提示持久化提供程序运行时 数据应该是懒惰的,当它 是第一次访问。实施 被允许急切地获取数据 LAZY 策略提示具有 已指定。 尤其是懒惰 获取可能仅适用于 Basic 的映射 使用基于属性的访问。

在 EclipseLink 的特定情况下,行为将取决于上下文(Java EE 与 Java SE),如What You May Need to Know About EclipseLink JPA Lazy Loading 中所述。

在 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 时执行延迟加载,请考虑以下情况之一:

How to Configure Dynamic Weaving for JPA Entities Using the EclipseLink Agent How to Configure Static Weaving for JPA Entities

【讨论】:

您的链接已失效... (;_;)【参考方案2】:

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

@Entity
public class Person 
    @Id int id;
    @Basic String name;
    @Basic(fetch = FetchType.LAZY) String remark;

【讨论】:

每次获取一个 Person 时,这不会仍然获取 remark 吗? 我没试过,不过根据wiki.eclipse.org/Introduction_to_EclipseLink_JPA_(ELUG)#.40Lob,EclipseLink应该支持lazy lob @nanda 那里的文档是否与将 BASIC 定义为 EGAR 的 wiki.eclipse.org/EclipseLink/UserGuide/JPA/… 冲突【参考方案3】:

我们解决了这个问题(在使用 ActiveRecord 和 Hibernate 时),方法是将大字符串(通常是 CLOB 或 BLOB)放入它自己的表中,并在主表(本例中为 Person)的 FK 中。然后它就像你想要的那样工作.

【讨论】:

以上是关于EclipseLink:默认情况下不获取某些字段的主要内容,如果未能解决你的问题,请参考以下文章

RedShift - 插入初始单个值时,在某些情况下不尊重标识种子值

UIImageView autoresizingmask 在某些情况下不起作用

Eclipselink 更新现有表

为啥回顾中的有限重复在某些情况下不起作用?

Redshift ROUND 函数在某些情况下不舍入?

在某些情况下不调用 UIGestureRecognizerState.Ended