Я нашел много раз в stackoverflow этой проблеме, но ничто из них не дает мне четкого ответа. Для простоты есть только две таблицы фильм и язык связанный много к одному отношение. Все сделано согласно Netbeans Hibernate DVD Store tutorial. Теперь, как отобразить на первой странице (index.xhtml) язык. Это выглядит очень просто. Просто добавьте:Проблема с гибернацией: org.hibernate.LazyInitializationException: не удалось инициализировать прокси - нет сеанса
<h:column>
<f:facet name="header">
<h:outputText value="Language"/>
</f:facet>
<h:outputText value="#{item.languageByLanguageId.langName}"/>
</h:column>
(Comumn в таблице языкаимя было переименовано в langName) Но он выдает все тот же LazyInitializationException. Я попытался получить languageId, и в этом случае я был успешным. Это означает, что # {item.languageByLanguageId.langName} дает исключение, но # {item.languageByLanguageId.languageId} нет. Это странно. Итак, что произойдет, когда я использую явный выбор в соответствии с languageId, если я могу его получить.
Поэтому я добавил в FilmController.java Способ получения языка:
public String getLanguageById(Integer langId) {
String language = helper.getLangById(langId);
return language;
}
И FilmHelper.java (окончательный вариант):
public Film getFilmById(int filmId) {
Film film = null;
try {
session = HibernateUtil.getSessionFactory().getCurrentSession();
org.hibernate.Transaction tx = session.beginTransaction();
Query q = session.createQuery("select count(film.filmId) from Film as film where film.filmId = :filmId");
q.setParameter("filmId", filmId);
Number count = (Number) q.uniqueResult();
if (count.intValue() > 0)
film = (Film) session.load(Film.class, filmId);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
}
return film;
}
И да, он работает, я могу получить имя языка для изменения index.xhtml:
<h:outputText value="{filmController.getLanguageById(item.languageByLanguageId.languageId)}"/>
Чем я попытался изменить FilmActor.hbm.xml добавить ленивым = "ложь" и использовать происхождение простое решение в index.xhtml ("# {} item.languageByLanguageId.langName"):
<many-to-one name="languageByOriginalLanguageId" class="dvdrental.Language" lazy="false" fetch="select">
<column name="original_language_id" />
</many-to-one>
Снова он работает правильно. Даже если я установил lazy = "proxy" или lazy = "no proxy". Но все же я не понимаю, как использовать этот атрибут по умолчанию lazy = "true". Если я попытаюсь сохранить весь документ за один сеанс (не делайте фиксацию, которая вызывает конец сеанса), есть еще одна проблема с исключением. Похоже, что lazy = "true" не отвечает в подходящий момент времени.