Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate мапинг


Автор: m1ha 2.2.2008, 21:10
Имеются 3 таблицы. CAR, CAR_ID, CAR_USER
Таблица CAR содержит поля ID и CAR_ID и выполняет роль журналирования, то есть одна машина может быть записана несколько раз
Пример CAR
Код

ID    CAR_ID                
----- -----------
0       99
1       110
2       99
3       110
4       99


Таблица CAR_ID содержит уникальные ID машины
Пример CAR_ID
Код

ID
-------
99
110


Таблица CAR_USER содердит в себе унакальный ID машины, и ID пользователя
пример CAR_USER
Код

ID    CAR_ID    USER_ID            
----- -----------  -----------
1        99            20             
2        99            21
3        99            22
4        110          26
5        110          28

Описываю класс Car
У одной машины может быть много пользователей следовательно связь OneToMany
Код

@Entity
public class Car implements Serializable {

@OneToMany
@JoinColumn(name = "CAR_ID")
  private List<CarUser> carUser = new LinkedList<CarUser>();
}


Ну и кодгда пытаюсь загрузить пользователей машины получаю
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: car.model.carUser, no session or session was closed at
org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358) at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350) at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:343) at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86) at org.hibernate.collection.PersistentBag.toString(PersistentBag.java:483) at java.lang.String.valueOf(String.java:2615) at java.io.PrintStream.print(PrintStream.java:616) at java.io.PrintStream.println(PrintStream.java:753) 
Думаю, что ошибка в мапинге. Но как сделать его правильно пока не знаю.

Автор: Ornitos 2.2.2008, 22:00
Ошибка скорее всего не в мэпинге.

Покажи как ты загружаешь пользователей.

Ещё можешь вот это посмотреть: http://kibungo.livejournal.com/21920.html?mode=reply

Автор: m1ha 2.2.2008, 22:26
ну так все остальные обьекты класса Car (которые так же беруться из базы) получить можно, а exception возникает только когда обращаешься к carUser я всё таки думаю, что проблема в мапинге.

Автор: Kangaroo 2.2.2008, 22:39
Цитата(m1ha @  2.2.2008,  20:10 Найти цитируемый пост)
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: car.model.carUser, no session or session was closed at

Это не в маппинге ошибка, а просто вы обращаетесь к коллекции, когда уже закрыли сессию. И Хайбернейт не может подгрузить настоящие объекты из базы.
Можно замапить, чтобы он не использовал лейзи инициализацию, а сразу все грузил. С маппинг файлами я использовал:
Код

 lazy="false"  outer-join="true" 

А вот как это аннотациями сделать не знаю.

Автор: arthurkas 12.3.2008, 05:52
Цитата

А вот как это аннотациями сделать не знаю.

Код

@OneToMany(fetch = FetchType.EAGER)


FetchType.EAGER тоже что и lazy="false"

Автор: teg 13.3.2008, 22:39
Ставить EAGER - плохой тон, также как и использование списка и инициализация в поле.
Итого:
* надо оставить LAZY, но про хайбер что-то таки прочитать
* List заменить на Set
* убрать код инициализации поля

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)