【发布时间】: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 建立关系。
但是,延迟加载会产生两个问题:
- 延迟加载会围绕
OneToMany关系创建一个我不需要的代理。我不需要访问OneToMany关系根本,我需要我能获得的所有性能改进。 - 许多其他查询需要预先获取,并且将所有
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