我有这样的父母:
@Entity
@Table(name="parent")
public class Parent {
private List<Child> childs;
private List<AnotherChild> anotherChilds;
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
public List<Child> getChilds() {
return childs;
}
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
public List<AnotherChild> getAntoherChilds() {
return anotherChilds;
}
//Getters and Setters ommited
}
这样的两个孩子
@Entity
@Table(name="child")
public class Child {
private Parent parent;
@ManyToOne
@JoinColumn(name = "column_name")
public Parent getParent() {
return patern;
}
}
@Entity
@Table(name="another_child")
public class AnotherChild {
private Parent parent;
@ManyToOne
@JoinColumn(name = "column_name")
public Parent getParent() {
return patern;
}
}
我有一个命名查询,它可以获取所有的父母,但是这也加载了所有的孩子?如何阻止孩子自动加载?
感谢。
答案 0 :(得分:2)
我知道我的答案来晚了,但可能会帮助其他人,因为我有一段时间遇到相同的问题, 基于此answer(如果您使用rest API),Spring调用Jackson来返回Parent对象,而Jackson调用getChild,因此,parent的孩子被加载。 一种解决方案是为不包含Child的Parent类定义一个Dto类,例如
public class ParentResponseDto{
private Long id
private String name;
//and your desired attribute that you want to load
}
然后在rest控制器中返回ParenResponseDto
@GetMapping
public ParenResponseDto getParent(Long id){
Parent p = repository.findById(id);
ParenResponseDto dto = mapParentToParenResponseDto();
return dto;
}
您可以使用ModelMapper映射类,这是一个很棒的模块
答案 1 :(得分:0)
延迟加载是计算机编程中常用的设计模式,用于将对象的初始化推迟到需要它的位置。如果正确和适当地使用它,它可以有助于程序操作的效率。与延迟加载相反的是急切加载。
如何在Hibernate中启用延迟加载
在进一步研究之前,重新调整默认行为非常重要 在使用hibernate映射与注释的情况下延迟加载。 默认行为是“急切地”加载“属性值”并加载 '懒洋洋地收藏'。与你可能记得的相反,如果你有 之前使用普通的Hibernate 2(映射文件),其中所有引用 (包括集合)默认情况下会急切加载。另请注意 @OneToMany和@ManyToMany协会默认为LAZY加载; 和@OneToOne和@ManyToOne默认为EAGER加载。这是 重要的是要记住以后避免任何陷阱。启用懒惰 明确加载你必须使用&#34; fetch = FetchType.LAZY&#34;在...上 您在使用hibernate时想要延迟加载的关联 注释。示例用法如下所示:@OneToMany( mappedBy =&#34; category&#34;,fetch = FetchType.LAZY)private Set产品; 另一个与&#34; FetchType.LAZY&#34;平行的属性是&#34; FetchType.EAGER&#34; 这与LAZY正好相反,即它会将关联实体加载为 当第一次获取所有者实体时。懒惰加载如何工作 在Hibernate中Hibernate可以应用延迟加载的最简单方法 您的实体和协会的行为是通过提供代理 实施它们。 Hibernate拦截对实体的调用 用代理代替从实体类派生的代理。在哪里 请求的信息丢失,将从数据库加载 在控制权转让给母公司的实施之前。请 请注意,当关联表示为集合类时, 然后是一个包装器(基本上是集合的代理,而不是 为它所包含的实体创建并替换它 原创系列。什么时候访问这个集合代理 你得到的内部返回代理集合不是代理实体; 相反,它们是实体。你不需要施加太大的压力 理解这个概念,因为在运行时它几乎不重要。