繁体   English   中英

渴望加载一个懒惰的儿童集合

[英]Eager loading a lazy child collection

我有类似的数据模型

class Office
{
   @ManyToOne
   @JoinColumn(name = "cafeteria_id")
   Cafeteria cafeteria;
}

class Cafeteria
{
   @OneToMany(mappedBy="cafeteria")
   @LazyCollection(value=LazyCollectionOption.EXTRA)
   List<Chair> chairs;
}

class Chair
{
    @ManyToOne
    @JoinColumn(name = "cafeteria_id")
    Cafeteria cafeteria;
}

我有这样的JPQL查询

select o from Office o where o.cafeteria.someThing = ?

以上查询工作正常但在一种情况下我想要一个可以急切加载所有椅子(o.cafeteria.chairs)的查询。 我应该如何修改查询以急切地获取所有椅子?

OneToMany批注中使用fetch属性。 您可以根据需要多次映射相同的关系:

class Cafeteria {
   @OneToMany(mappedBy="cafeteria")
   @LazyCollection(value=LazyCollectionOption.EXTRA)
   List<Chair> chairs;

   @OneToMany(fetch = FetchType.EAGER, mappedBy="cafeteria")
   List<Chair> eagerlyLoadedChairs;
}

然后你可以使用它们中的任何一个:

// Lazy loading
select o from Office o inner join o.cafeteria c inner join c.chairs ch where c.someThing = ?

// Eager loading
select o from Office o inner join o.cafeteria c inner join c.eagerlyLoadedChairsch where c.someThing = ?

您有两个选项,要么将获取类型从Lazy更改为Eager ,但每次从Cafeteria加载对象时,这将始终加载您的List of Chair

像这样:

@OneToMany(mappedBy="cafeteria", fetch=FetchType.EAGER)
@LazyCollection(value=LazyCollectionOption.FALSE)
List<Chair> chairs;

或者在调用此查询的Service中,在调用它之后,只需在特定用例中加载主席列表,查看有关在Hibernate中初始化集合的详细信息

Hibernate.initialize(cafeteria.getChairs());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM