Почему здесь происходит исключение LazyInitializationException? - PullRequest
2 голосов
/ 04 декабря 2011

Итак, у меня есть эта сущность с FetchType.LAZY collection:

@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 следующим образом:

@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 Ответ

1 голос
/ 05 декабря 2011

Основным исключением было EntityNotFoundException.

OtherEntity имеет обязательную взаимно-однозначную связь с SomeOtherEntity, которая не найдена в базе данных. Я не видел его в журналах, потому что вход в наш проект не был настроен должным образом. Кроме этого, LazyInitializationException кажется странным в этом случае. Похоже, Hibernate оборачивает EntityNotFoundException в LazyInitializationException. Причина этого мне не ясна.

...