当前位置: 首页 > 知识库问答 >
问题:

在不延迟加载的情况下使用JPA检索没有关系的实体

蒋胡非
2023-03-14

我有一个实体,它与其他实体有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的Basic属性感兴趣,而不想检索任何OneTo很多关系。一个选项是使用finch=FetchType建立所有OneTo很多关系。懒惰的代码。

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

  1. 延迟加载会在我不需要的OneToMany关系周围创建一个代理。我根本不需要访问OneToMany关系,我需要能够获得的所有性能改进
  2. 许多其他查询需要即时抓取,将所有OneToManymanytone关系更改为延迟抓取会使其他查询变得麻烦

有没有一种方法可以选择在不使用延迟抓取的情况下动态检索哪些关系。使用标准JPQL是否可以实现这一点?

我在Glassfish中使用Eclipse Link。

我以前研究过Eclipse Link提取组,这在某种程度上解决了我的问题。然而,我碰到了这个问题:https://stackoverflow.com/questions/19577864/classdescriptor-returns-null-fetchgroupmanager-when-trying-to-create-an-eclipsel


共有1个答案

白泽语
2023-03-14

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

 类似资料:
  • 这是我的pb。 我有一个实体游戏和一个实体控制台 这是一个多个关联。 为了提高性能,我在同一查询中加载游戏和控制台,如下所示: 当我使用

  • 问题内容: 我以这样一种方式进行了JPA设置:如果我不使用延迟加载,则几乎将加载整个数据库。我也直接在模型上使用序列化,因此有时我需要初始化代理。 我只想在集合上使用延迟加载。急切地获取某些奇异实体的事实就很好了。但是,无论我如何尝试设置集合,我都永远不会得到代理集合,而我总是会得到完全加载的集合。 这是一些示例代码: 所以这里的问题是,当我检查调试器时,答复的persistantBag-list

  • 问题内容: 我在JPA实体中的延迟加载属性有问题。我读过许多类似的问题,但它们与spring或hibernate有关,并且他们的后代不适用或没有帮助。 该应用程序是在Wildfly应用程序服务器上运行的JEE和JPA2.1。有两个实体,DAO会话bean和servlet将它们放在一起: 当我运行此代码时,它失败并显示: 我对WebLogic / JPA1使用了非常相似的模式,并且运行平稳。任何的想

  • 看了几个网页后,我仍然不明白为什么我的@ElementCollection会急切地加载。我的理解是,默认情况下任何@ElementCollection都应该总是懒洋洋地加载。正如您所看到的,情况并非如此--您将在本文末尾看到控制台的输出。我试图使用@ElementCollection(fetch=fetchType.lazy)注释强制执行惰性加载,但这并没有改变任何事情。有没有人可以解释一下,也可

  • 我试图验光一些报告,并试图删除需要加载一些昂贵的相关记录(多个级联加载,每个约500条记录)。 我的实体是这样的: 以及: 我的问题是,当我做这个调用:Hibernate去实例化Foo实体,并加载所有相关的记录,即使我只想要/需要id,这是我的Bar表中的外键。 有没有办法得到福。在没有加载Foo记录的情况下从酒吧获得Id?提前谢谢。