JPA - 只获得父母,而不是孩子

时间:2016-12-15 03:51:23

标签: java sql spring hibernate jpa

我有这样的父母:

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

我有一个命名查询,它可以获取所有的父母,但是这也加载了所有的孩子?如何阻止孩子自动加载?

感谢。

2 个答案:

答案 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拦截对实体的调用   用代理代替从实体类派生的代理。在哪里   请求的信息丢失,将从数据库加载   在控制权转让给母公司的实施之前。请   请注意,当关联表示为集合类时,   然后是一个包装器(基本上是集合的代理,而不是   为它所包含的实体创建并替换它   原创系列。什么时候访问这个集合代理   你得到的内部返回代理集合不是代理实体;   相反,它们是实体。你不需要施加太大的压力   理解这个概念,因为在运行时它几乎不重要。