如何重新初始化延迟加载的实体?

时间:2011-09-16 11:23:50

标签: hibernate lazy-loading vaadin

我有一个实体人:

class Person {
  String name;
  String phone;
  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
  Set<Address> addresses = new HashSet<Address>();
}

当我在桌子上显示人员时,我不想加载地址。 当我打开编辑对话框时,我也想显示地址。但是我得到了Lazzy加载异常(没有活动会话)。

如何重新初始化Person实例以加载地址?

1 个答案:

答案 0 :(得分:2)

调用另一个方法,该方法将从数据库中重新加载此人及其地址:

public Person loadPersonWithAddresses(Long personId) {
    Person p = (Person) getSession().get(Person.class, personId);
    Hibernate.initialize(p.getAddresses());
    return p;
}

public Person loadPersonWithAddresses(Long personId) {
    String hql = "select distinct p from Person p"
                 + " left join fetch p.addresses"
                 + " where p.d = :id";
    return (Person) getSession().createQuery(hql)
                                .setLong("id", personId)
                                .uniqueResult();
}

在单个查询中执行此操作。