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

JPA 急于加载 FetchType.Lazy 子集合

司徒炎彬
2023-03-14

我见过几个类似的问题有0个好答案。

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

@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何时这样做。不过这是第二步。第一步就是让这个工作正常。

共有2个答案

卫博雅
2023-03-14

我正在积极寻找你的第二个问题的答案:让JPA有时延迟加载东西,有时急切地加载东西。

至于你的第一个问题,在我看来,你想要的是使用getReference()而不是find()。如果你使用的是Hibernate,那么它会创建一个对象的引用,然后只在需要的时候获取它。

我相信这会有所帮助: 何时使用实体管理器.find() vs 实体管理器.getReference()

申屠锦
2023-03-14

我已经这样做了。请参考这个,它也会在那里很好地工作:

@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;
    }

}
 类似资料:
  • 我尝试实现简单的一对多关联。在使用调试模式检查item对象后,我发现已经加载了list bids。但是List bids属性是用FetchType.Lazy注释的。一些书籍和网页声称FetchType.lazy是JPA提供者接受或拒绝的提示。但我想知道JPA提供程序在什么情况下忽略FetchType.lazy。提前谢谢你。

  • 我无法在hibernate中急切地加载多态相关对象。我知道默认的FetchType渴望@Any,但我不能急于加载字段。下面是一段代码片段: 当我从hibernate通过id获取它时,会出现延迟初始化异常。我不明白为什么会这样。谁能帮忙吗?

  • 我通过提示检查了它在EclipseLink中的工作情况: 这个链接http://blog.ringerc.id.au/2012/06/jpa2-is-very-inflexible-with-eagerlazy.html暗示通过Hibernate是不可能的,建议手动获取。但是,我无法理解如何通过HQL或标准来实现它,特别是如何获得不在实体上但仅存在于数据库上的child.parent_id列。即避

  • 让CriteriaQuery加载多对一个关系而不明确地告诉它,我遇到了一些麻烦,而且要在查询中复制我的实体注释来使其工作,这似乎很奇怪: 除其他字段外,“我的实体计算机”包含以下关系: @ManyToOne(fetch=FetchType.Eage)@JoinColumn(name=“Employee”,nullable=false)private Employee=Null; 据我所知,当我加载

  • 我正在尝试< code>fetchType的示例。懒惰,但是在调试代码时,似乎< code>fetchType。懒惰不起作用。 实体bean:地址 添加了属性为fetch=fetchType的注释@Basic。懒散地在地区赛场上。 我的实体bean由以下代码定义: 使用上述实体 Bean 的方法: 因此,在方法调用之后,当我检查地址对象时,它已经填充了区域字段。 请让我知道我是否缺少某些配置,或者

  • 一些adapter支持过滤策略管理。 这意味着Casbin加载的策略是基于给定过滤器的存储策略的子集。 当解析整个策略成为性能瓶颈时,这将会允许在大型多租户环境中有效地执行策略。 要使用支持的adapter处理过滤后的策略,只需调用 LoadFilteredPolicy 方法。 过滤器参数的有效格式取决于所用的适配器。 为了防止意外数据丢失,当策略已经加载, SavePolicy 方法会被禁用。