Я хотел бы получить некоторые разъяснения относительно отложенной загрузки и границ сеанса и т. Д.
Моя структура кода выглядит следующим образом
@Entity
class A {
....
@OneToOne(fetch=LAZY)
private B b;
..
}
@Entity
class B {
private id;
private name;
}
@Transactional(SUPPORTS)
ADao {
A findById(int id);
}
@Transactional(SUPPORTS)
LayerDB {
A getAForId(int i) {
return adao.findById(i);
}
}
//Note that there is no transactional attribute here
LayerB {
public boolean doSomethingWithAandB(int aId) {
A a = LayerDB.getAForId(aId);
if(a.getB().getName().equals("HIGH"))
return true;
return false;
}
}
//start transaction here
@Transaction(REQUIRED)
LayerC {
LayerB layerb;
private handleRequest(int id) {
layerb.doSomethingWithAandB(id);
}
}
Теперь, когда мы пытаемся получить доступ к B в объекте A внутриметод
doSomethingWithAandB
Получаю ленивое исключение инициализации при попытке доступа к B.
Даже если метод находится в транзакции, созданной в LayerC, я получаю следующее исключение
Exception : org.hibernate.LazyInitializationException: could not initialize proxy - no Session
Но при изменении следующих двух методов:
@Transactional(SUPPORTS)
LayerDB {
A getAForId(int i) {
A a = adao.findById(i);
a.getB().getName();
return a;
}
}
//Note that there is no transactional attribute here
LayerB {
public boolean doSomethingWithAandB(int aId) {
A a = LayerDB.getAForId(aId);
if(a.getB().getName().equals("HIGH"))
return true;
return false;
}
}
Почему он не использует транзакцию / сеанс, созданные в LayerC?
Даже если у нас есть SUPPORTS наDBLayer, он создает отдельную «сессию».
Любые указатели для правильного понимания очень мне помогут.
Спасибо.