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

时间:2013-10-27 00:22:28

标签: java-ee jpa eclipselink jpql

我有一个实体与其他实体有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. 许多其他查询需要急切提取,并且将所有OneToManyManyToOne关系更改为延迟提取会使其他查询变得繁琐。
  3. 有没有办法选择应该动态检索哪些关系而不使用延迟提取。这是否可以使用标准JPQL?

    我在Glassfish中使用EclipseLink。

    我以前曾调查过EclipseLink fetch groups,这有点解决了我的问题。但是,我遇到了这个问题:https://stackoverflow.com/questions/19577864/classdescriptor-returns-null-fetchgroupmanager-when-trying-to-create-an-eclipsel

1 个答案:

答案 0 :(得分:1)

如果您想要的只是名称或其他基本属性,请不要返回船只实体。如果你正在追求的话,JPA允许返回原始数据而不是你的manged实体。在一个并不总是需要的关系上使用lazy会加快速度,而不是减慢速度,但是当需要序列化并且需要关系时,它确实需要进行规划。 Eclipselink还根据需要提供部分加载实体的提取和属性组。有关详细信息,请参阅http://wiki.eclipse.org/EclipseLink/Examples/JPA/AttributeGroup