Как повторно инициализировать ленивый загруженный объект? - PullRequest
0 голосов
/ 16 сентября 2011

У меня есть лицо Person:

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

Когда я отображаю людей за столом, я не хочу загружать адреса.Когда я открываю диалог редактирования, я тоже хочу отображать адреса.Но я получил исключение при загрузке Lazzy (нет активного сеанса).

Как можно повторно инициализировать экземпляр Person для загрузки адресов?

1 Ответ

2 голосов
/ 16 сентября 2011

Вызовите другой метод, который перезагрузит человека из базы данных вместе с его адресами:

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();
}

, чтобы сделать это в одном запросе.

...