2016-12-15 48 views
0

我有这样的家长: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; 
    } 
} 

我有一个名为查询它获取所有的父母,但是这也正在加载所有的孩子?我怎样才能阻止孩子自动加载?

谢谢。

+0

请发布您的查询,获取父。 –

+0

@AbdullahWasi它只是标准的findAll查询,并被称为表单JAX-RS作为一个命名查询 – iqueqiorio

+0

延迟加载是默认的,所以如果他们被加载,那么它是你的代码,它是这样做的 - 所以发布相关码。 –

回答

0

延迟加载是计算机编程中常用的一种设计模式,用于推迟对象的初始化直到需要它的点。如果适当和适当地使用,它可以有助于程序运行的效率。延迟加载的对面是渴望加载

如何在Hibernate中

启用延迟加载进一步移动之前,回顾一下在使用Hibernate映射VS注释的情况下延迟加载的默认行为 是很重要的。 默认行为是加载“属性值”并加载 '集合lazily'。相反,如果您之前有 使用普通Hibernate 2(映射文件),那么所有引用 (包括集合)默认情况下都会被加载。另请注意, @OneToMany和@ManyToMany关联默认为LAZY加载; 和@OneToOne和@ManyToOne默认为EAGER加载。这是 重要的是要记住在将来避免任何陷阱。要明确加载 ,必须在 关联上使用“fetch = FetchType.LAZY”,当您使用hibernate 批注时,您希望延迟加载。一个示例用法如下所示:@OneToMany( mappedBy =“category”,fetch = FetchType.LAZY)private设置产品; 与“FetchType.LAZY”平行的另一个属性是“FetchType.EAGER” ,它与LAZY恰好相反,即当第一次获取拥有者实体时,它将会将关联实体加载为 。懒惰加载如何在Hibernate中工作 Hibernate可以将延迟加载 行为应用于您的实体和关联的最简单方法是通过提供代理 执行它们。 Hibernate通过 截取对实体的调用,用代理替代从实体类派生的实体。在缺少 请求的信息的情况下,在将控制权交给父实体实施之前,将从数据库 加载它。请注意,当关联被表示为集合类时, 将创建一个包装(实质上是集合的代理,而不是包含它所包含的实体的 ),并替换原始集合中的 。当你访问这个集合代理时,你在返回的代理集合中得到的是什么 不是代理实体;而不是他们是实际的实体。您不需要在理解这个概念上施加太大的压力,因为在运行时它几乎不重要。

相关问题