org.hibernate.LazyInitializationException: не удалось инициализировать лениво набор ролей: com.t4bt.gov.persistence.entities.Experts.institutaionList, не сеанс или сеанс был закрытКак решить проблему org.hibernate.LazyInitializationException?
ответ
Вы обеспечиваете очень мало деталей в вашем вопрос (код?), поэтому он должен быть обобщенным ответом на ленивую загрузку. В будущем, если вы хотите получить ответы, предоставьте конкретную информацию о фактической проблеме, а также описание того, что вы пытались ее решить.
LazyInitialization происходит, когда вы пытаетесь получить доступ к лениво загруженному свойству после закрытия сессии (что обычно после завершения транзакции). Способ ленивой инициализации заключается в том, что при извлечении объекта он не получает лениво инициализированные свойства, но когда вы на самом деле пытаетесь получить к нему доступ, Hibernate выполняет другой запрос к базе данных, чтобы получить его.
Ниже будет производить такую ошибку:
public class Something {
[...]
@OneToMany(fetch = FetchType.LAZY)
private List<SomethingElse> somethingElse;
public List<SomethingElse> getSomethingElse() {
return somethingElse;
}
}
public class SomethingDao {
@Inject
private EntityManager em;
@Transactional
public Something getById(final Integer id) {
return em.find(Something.class, id);
}
}
public class SomethingService {
@Inject
private SomethingDao dao;
public List<SomethingElse> getSomethingElseForSomething(final Integer somethingId) {
final Something something = dao.getById(somethingId);
return something.getSomethingElse() //Throws LazyInitializationException
}
}
Вот сделка (и, таким образом, сеанс) существует только в DAO-класса. После выхода из dao-метода сеанс исчез. Поэтому, когда вы пытаетесь получить доступ к ленивому загружаемому свойству в службе, он не сработает, когда Hibernates попытается связаться с сеансом, чтобы получить его.
Чтобы избежать этого, существует несколько возможностей. не
- Изменения аннотации Something-класс
@OneToMany(fetch = FetchType.EAGER)
Свойства больше не лениво загружено, поэтому нет больше проблем. - Добавить
@Transactional
в Сервис-метод. Тогда вызовgetSomethingElse()
будет в той же транзакции, что и выборка объекта Something, и при этом сеанс будет оставаться живым. - Добавить вызов в
getSomethingElse()
в Дао-метод. Затем он инициализирует свойство (извлекает его из базы данных) перед тем, как покинуть Dao-класс (и транзакцию), и он будет доступен вне транзакции, без необходимости связываться с сеансом, чтобы получить его.
- 1. Как решить эту проблему?
- 2. Как решить проблему позиционирования?
- 3. Как решить эту проблему?
- 4. Как решить эту проблему?
- 5. Как решить эту проблему?
- 6. Как решить эту проблему?
- 7. как решить проблему взаимоблокировки?
- 8. Как решить проблему обещания?
- 9. Как решить проблему ajaxcontroltoolkit.extendercontrolbase.dispose()?
- 10. как решить проблему swrevealviewcontroller
- 11. Как решить эту проблему?
- 12. Как решить проблему Theme.AppCompat.Light
- 13. Как решить эту проблему?
- 14. Как решить проблему jQuery?
- 15. Как решить проблему SecurityException?
- 16. Как решить эту проблему?
- 17. как решить эту проблему?
- 18. Как решить проблему nsusredefaults
- 19. Как решить проблему javax.mail.AuthenticationFailedException
- 20. Как решить проблему параллелизма?
- 21. Как решить проблему оптимизации
- 22. Как решить проблему mysql_fetch_array()
- 23. Как решить проблему javax.mail.AuthenticationFailedException?
- 24. Как решить эту проблему UITextView
- 25. Как решить проблему с весной
- 26. java.lang.NoClassDefFoundError Как решить эту проблему?
- 27. Как решить эту проблему вращения?
- 28. Как решить проблему преобразования кода?
- 29. Как решить проблему с mainthread
- 30. Как мне решить проблему brut.androlib.AndrolibException
возможно дубликат [org.hibernate.LazyInitializationException: Как правильно использовать ленивую функцию загрузки библиотеки Hibernate] (http://stackoverflow.com/questions/5837169/org-hibernate-lazyinitializationexception-how-to-properly-use -hibernates-ленивый) –