Почему здесь происходит LazyInitializationException?
Итак, у меня есть эта сущность с коллекцией FetchType.LAZY
:
@Entity
public class Entity implements Serializable {
@OneToMany(mappedBy = "entity", fetch=FetchType.LAZY)
private List<OtherEntity> lazyCollection;
//getters and setters
}
@Entity
public class OtherEntity implements Serializable {
@ManyToOne
@JoinColumn(name = "entity", nullable = false)
private Entity entity;
}
И у меня есть следующие услуги:
public class ServiceA implements Serializable {
public Entity loadEntity(Long entityId) {
return em.find(Entity.class, entityId);
}
}
public class ServiceB extends ServiceA {
public Map<? extends X, ? extends Y> load(Long entityId) {
Entity entity = loadEntity(entityId);
//play with entity and fill the map with required data
return prepareMap(entity, map);
}
//meant to be overriden in inheriting services
protected Map<? extends X, ? extends Y> prepareMap(Entity entity,
Map<? extends X, ? extends Y> map) { return map; }
}
@Stateless
public class ServiceC extends ServiceB {
@Override
protected Map<? extends X, ? extends Y> prepareMap(Entity entity,
Map<? extends X, ? extends Y> map) {
if (entity.getLazyCollection() != null
&& !entity.getLazyCollection.isEmpty()) {
// play with entity and put some other data to map
}
return map;
}
}
Теперь я пытаюсь позвонить ServiceB#load
из CDI bean следующим образом:
@Named
@SessionScoped
public class void WebController implements Serializable {
@EJB
private ServiceC service;
public void loadEntity(Long entityId) {
service.load(entityId);
}
}
Но когда я доберусь до ServiceC
entity.getLazyCollection.isEmpty()
звоню, получаю LazyInitializationException: illegal access to loading collection
. Я не понимаю, почему.
Означает ли это, что после загрузки сущность каким-то образом отделилась?
Я даже пытался переопределить метод ServiceA#loadEntity
в ServiceC
, чтобы вызвать entity.getLazyCollection()
, чтобы вызвать фактическую загрузку из базы данных, но я все равно получите это LazyInitializationException
.
1 ответ:
Основным исключением было
EntityNotFoundException
.
OtherEntity
имеет обязательную взаимно однозначную ассоциацию сSomeOtherEntity
, которая не была найдена в базе данных. Я не видел этого в журналах, потому что вход в наш проект не был настроен должным образом. Кроме того,LazyInitializationException
кажется странным в этом случае. Похоже, что Hibernate обертываетEntityNotFoundException
вLazyInitializationException
. Причина для этого мне не ясна.