【问题标题】:EclipseLink: don't fetch some fields by defaultEclipseLink:默认情况下不获取某些字段
【发布时间】: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 可以吗?

【问题讨论】:

    标签: java orm jpa eclipselink jpql


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

    【讨论】:

    • 您的链接已失效... (;_;)
    【解决方案2】:

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

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

    【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 2012-02-29
      相关资源
      最近更新 更多