【问题标题】:Retrieve an entity without its relationships using JPA without Lazy Loading使用没有延迟加载的 JPA 检索没有关系的实体
【发布时间】:2013-11-05 23:01:58
【问题描述】:

我有一个与其他实体有OneToMany 关系的实体,例如下面的Boat 实体。实际上,实体有很多个字段。

@Entity
public class Boat {
    @Id
    private long id;
    private String name;

    @OneToMany(fetch=FetchType.EAGER)
    private List<Gun> guns;

    public List<Gun> getGuns() {
        return guns;
    }

    public String getName() {
        return name;
    }
}

对于某些搜索,我只对Boat 的基本属性感兴趣,不想检索任何OneToMany 关系。一种选择是将所有OneToMany 与fetch=FetchType.LAZY 建立关系。

但是,延迟加载会产生两个问题:

  1. 延迟加载会围绕OneToMany 关系创建一个我不需要的代理。我不需要访问OneToMany 关系根本,我需要我能获得的所有性能改进。
  2. 许多其他查询需要预先获取,并且将所有 OneToMany 和 ManyToOne 关系更改为延迟获取会使其他查询变得繁琐。

有没有一种方法可以在不使用延迟获取的情况下选择应该动态检索哪些关系。这可以使用标准 JPQL 吗?

我在 Glassfish 中使用 EclipseLink。

我之前研究过 EclipseLink 提取组,这可以解决我的问题。但是,我遇到了这个问题:https://stackoverflow.com/questions/19577864/classdescriptor-returns-null-fetchgroupmanager-when-trying-to-create-an-eclipsel

【问题讨论】:

  • 据我所知,延迟加载是默认设置,如果您使用的是 ORM 框架,则无法在没有代理的情况下实现实体。这就是为诸如延迟加载或仅“在需要时”更新之类的任务提供代理的全部意义。我真的不认为实体代理会成为您的性能瓶颈。
  • 在许多查询中,我不想解决关系,因此没有代理就不会实现任何事情。即使间接没有性能问题,将所有关系设置为lazy 也会损害我所有其他需要急切加载的查询。此外,EclipseLink 不支持 lazy 作为 Java SE 中一对一和多对一关系的获取模式 [lazy 将被忽略]。所以对这些关系使用惰性只能在 Java EE 容器中工作。

标签: jakarta-ee jpa eclipselink jpql


【解决方案1】:

如果您想要的只是名称或其他基本属性,请不要返回船实体。如果这是您所追求的,JPA 允许返回原始数据而不是您的管理实体。对并不总是需要的关系使用惰性虽然会加快速度,而不是减慢速度,但它确实需要计划何时可能涉及序列化并且需要关系。 Eclipselink 还提供获取和属性组以根据需要部分加载实体。详情见http://wiki.eclipse.org/EclipseLink/Examples/JPA/AttributeGroup

【讨论】:

  • 实际上,我的实体非常大,这样检索数据会很麻烦。
  • 告诉 JPA 你想要什么不是一种解决方法。您是否查看过属性组,因为这可能更符合您的要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 2013-05-21
相关资源
最近更新 更多