2015-03-06 2 views
1

Я получаю это исключение вложенное исключение составляет org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.ibm.ro.model.Location.subLocations, could not initialize proxy - no Session.LazyInitializationException Spring и Hibernate

я получаю, что при обращении к коллекции, сделка уже закрыта, поэтому код бросает это исключение. Вот мой пример кода

@Entity 
@Table(name="location") 
public class Location extends BaseEntity { 

    private static final long serialVersionUID = 1L; 

    private String name; 
    private List<Location> subLocations; 
    private Location location; 

    @Column(name="name") 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "location") 
    public List<Location> getSubLocations() { 
     return subLocations; 
    } 
    public void setSubLocations(List<Location> subLocations) { 
     this.subLocations = subLocations; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    public Location getLocation() { 
     return location; 
    } 
    public void setLocation(Location location) { 
     this.location = location; 
    } 

    @Override 
    public String toString() { 
     return "Location [name=" + name + ", subLocations=" + subLocations 
      + "]"; 
    } 

} 

Вот мой DAO:

@Repository("locationDao") 
public class LocationDao implements ILocationDao{ 

    @Autowired 
    private SessionFactory sessionFactory; 

    @Override 
    public List<Location> getAll() { 
     Session sess = getSession(); 
     return sess.createCriteria(Location.class).setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY).list(); 
    } 
} 

Тогда вот моя служба:

@Service("locationService") 
@Transactional 
public class LocationService implements ILocationService{ 

    @Autowired 
    ILocationDao dao; 

    @Override 
    public List<Location> getAll() { 
     return dao.getAll(); 
    } 
} 

Вот контроллер, где исключение бросают:

@Controller 
public class BaseController { 

    @Autowired 
    ILocationService service; 

    private static final String VIEW_INDEX = "index"; 
    private final static org.slf4j.Logger logger = LoggerFactory.getLogger(BaseController.class); 

    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public String location(ModelMap model) {   
    logger.debug(service.getAll().toString()); 
     return VIEW_INDEX; 
    } 
} 

Что я могу сделать для устранить проблему, не используя OpenSessionInViewFilter?

+0

Вы можете получить их с нетерпением, изменив в сущности –

ответ

1

Вы можете выполнить итерирование своего местоположения внутри вашей службы (где у вас все еще есть транзакция) и вызвать Hibernate.initialize по элементам, инициализацию силы постоянной коллекции.

@Override 
    public List<Location> getAll() { 
     List<Location> locations = dao.getAll(); 
     for (Location location : locations) { 
      Hibernate.intialize(location.getSubLocations()) 
     } 
     return locations; 
    } 
+0

Он имеет @Transactional, ему не нужно называть '' 'Hibernate.intialize''' явно, называя' '' location.getSubLocations() '' ' в его обслуживании будет достаточно, и подсекции будут инициализированы. – vtor

+0

true, хотя он должен был бы вызвать location.getSubLocations(). Size() или любой другой метод. Но Hibernate.initialize - это выделенный метод, который позволяет избежать этого. Он явно обозначает цель только инициализации. В противном случае, если бы это была JPA, я бы прибегнул к тому, что вы упомянули, но я понимаю, что OP использует Hibernate напрямую, и в этом случае я бы использовал Hibernate.initialize вместо этого, мое мое правило большого пальца –

+0

Я понимаю, что это лучшая практика от HIbernate. Однако предоставление услуг в зависимости от ORM не является хорошей идеей imho. Что, если завтра вы передумаете и перестанете использовать спящий режим? Поэтому лучше держать его как можно более чистым и не зависеть от конкретных методов ORM. – vtor

 Смежные вопросы

  • Нет связанных вопросов^_^