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 - 插入初始单个值时,在某些情况下不尊重标识种子值