Как маршалировать объект Hibernate, используя JAXB, через публичный get с @XmlIDREF и отложенной загрузкой - PullRequest
0 голосов
/ 02 марта 2012

В моей программе на Java я хочу преобразовать мои постоянные объекты Hibernate в XML.Для этого я использую JAXB.Проблема в том, что при маршалинге объекта я получил NullPointerException.

Это вызвано ленивой загрузкой стратегии загрузки.При переключении на активную выборку процесс маршалинга работает.

Я использую геттер вместо переменной, чтобы Hibernate мог инициализировать объект.У меня нет LazyInitializationException, поэтому нет закрытой сессии и т. Д.

Псевдокод:

Session s = sessionFactory.openSession();
Criteria crit = s.createCriteria(Entity.class);
List list = crit.list();
Entity entity = (Entity) list.get(0)
try {
    DocumentResult dr = new DocumentResult();
    context = JAXBContext.newInstance(entity.getclass());
    Marshaller marshaller = context.createMarshaller();
    marshaller.marshal(entity, dr);
}
catch(JAXBException e) {
    // ignore
}

1 Ответ

0 голосов
/ 02 марта 2012

Если вы распределяете лениво загруженные атрибуты своей сущности, тогда она не может быть отсоединена , иначе она должна быть связана с активным сеансом. Ваши варианты:

  1. Сохранять сеанс, в который была загружена исходная сущность, достаточно долго, чтобы завершить сортировку.
  2. Запустите новый сеанс и merge свою сущность в него, затем выполните сортировка.
  3. Сделайте ваши лениво загруженные атрибуты нетерпеливыми.

С другой стороны, я нахожу странным, что вы получаете исключение нулевого указателя. Вы должны проглотить LazyInitializationException где-то в вашем коде.

...