繁体   English   中英

在用户点击时休眠加载父母的孩子吗?

[英]Hibernate loading children of a parent on user click?

这是我的休眠POJO类。

@Entity
@Table(name = "PARENT")
public class Parent {

  @Id
  private int id;

  @Column(name = "NAME")
  private String name;

  @OneToMany(fetch = FetchType.LAZY, mappedBy = "parent")
  private List<Child> children;

  // Getters and Setters...
}

@Entity
@Table(name = "CHILD")
public class Child {

  @Id
  private int id;

  @Column(name = "NAME")
  private String name;

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "PARENT_ID", nullable = false)
  private Parent parent;

  // Getters and Setters...
}

从我对休眠的了解中,有两种方法。 (我仍然是菜鸟:P)

  Session session = sessionFactory.openSession();
  List<Child> children = null;

  try {
     children = session.createCriteria(Child.class, "C")
                  .add(Restrictions.eq("C.parent", parent)
                  .list();
  } finally {
    session.close();
  }

要么

  Session session = sessionFactory.openSession();
  List<Child> children = null;

  try {
     session.refresh(parent);
     children = parent.getChildren();
  } finally {
    session.close();
  }

后来的一个使用刷新,是我在尝试Hibernate时偶然发现的。

Q.1最好的方法是什么?

Q.2当仅通过调用getter方法可以获取所有子级时,为什么使用Criteria API或HQL来获取懒惰的加载成员?

仅当父对象附加到会话时,才可以通过调用getter方法来加载子代。 您可以通过加载对象(在上面的代码中调用refresh操作)或保存或更新将对象附加到会话。 请参阅文档以获取更多说明。 像下面的代码:

Session s = getSession();
Parent parent = s.get(parent, id);
List children = parent.getChildren();

基本上,这与使用条件API(使用的方式)相同。 Criteria和HQL用于许多其他事情。 就您而言,使用它们毫无意义。

暂无
暂无

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

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