0

这是我的休眠 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 为什么要使用 Criteria API 或 HQL 来获取延迟加载成员,而您只需调用 getter 方法即可获取所有子项?

4

1 回答 1

1

只有当父对象附加到会话时,您才能通过调用 getter 方法加载子对象。您可以通过加载对象(调用refresh对上述代码执行的操作)或保存或更新将对象附加到会话;有关更多说明,请参阅文档。像下面的代码:

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

这样做基本上与使用标准 API(您使用的方式)相同。Criteria 和 HQL 用于各种各样的其他事情。在您的情况下,使用它们毫无意义。

于 2013-10-18T02:19:10.577 回答