JPA急于加载FetchType.LAZY子集合 [英] JPA is eager loading FetchType.LAZY child collections

查看:0
本文介绍了JPA急于加载FetchType.LAZY子集合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我看到过几个类似的问题,答案为0。

这应该非常简单。我使用的是Java JPA,有时我想加载子实体列表,但不是所有时间都加载子实体列表。不幸的是,当我说懒惰地取它时,JPA似乎没有在听我说。我已经100%地确定,在我的代码中没有任何地方可以以任何方式访问ChildEntities属性。但是,所有子实体仍然会立即加载到我的JPA.em().find(..)打电话。这就是我声明与批注的关系的方式。

@Entity
@Table(name = "parentEntities")
public class ParentEntity implements Serializable {
    ....
    @OneToMany(mappedBy = "entityPropertyName", fetch = FetchType.LAZY)
    public List<ChildEntity> childEntities;
    ...
}

这是我加载父实体的方式:

ParentEntity parentEntity = JPA.em().find(ParentEntity.class, id);

此外,我希望有时急于获取这个集合,并能够动态地告诉JPA何时这样做。不过,这是第二步。第一步就是让它正常工作。

推荐答案

我就是这样做的。请参考这一点,它在那里也会工作得很好:

@Entity
@Table(name = "member_information")
    public class MemberInformation  implements Serilizable{

     @OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE},optional = false)
        private MemberInformationDetails memberInformationDetailsId;


     @LazyCollection(LazyCollectionOption.TRUE)
        @OneToMany(mappedBy = "memberInformationId", cascade = CascadeType.ALL)
        private Collection<AccountOpening> accountOpeningCollection;


    }

对于一对一映射使用@OneToOne(fetch = FetchType.LAZY....),对于集合使用@LazyCollection(LazyCollectionOption.TRUE)

@Entity
@Table(name = "member_info_details")
public class MemberInformationDetails implements Serializable{

@OneToOne(mappedBy = "memberInformationDetailsId")
    private MemberInformation memberInformationId;

.......//getter and setters

}


@Entity
@Table(name = "account_opening")
public class AccountOpening  implements Serializable {

 @JoinColumn(name = "member_information_id", referencedColumnName = "id", nullable = false)
    @ManyToOne(optional = false)
    private MemberInformation memberInformationId;

..........//getters and setters

}

当您想要访问集合时,先合并并获取对象:

@Stateless
public class MemberInformationFacade{
..............
  public MemberInformation getMemberWithMemberDetails(MemberInformation m) {
        m = getEntityManager().merge(m);
        try {
            m.getMemberInformationDetailsId().getId();


            m.getMemberInformationDetailsId().accountOpeningCollection().size();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return m;
    }

}

这篇关于JPA急于加载FetchType.LAZY子集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆