2013-10-12 1 views
0

У меня есть функция, которая просто получает местоположение по ID:Hibernate не приносит полей типа Wrapper сохраняющегося объекта при использовании нагрузки (класс, идентификатор)

public Location getLocationById(Long idSearchedLocation){ 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    session.beginTransaction(); 
    Location location = null;   
    try{    
     location = (Location) session.load(Location.class, idSearchedLocation); 
     //System.out.println(location.getLat() + " " +this.getClass().getName());  

    } catch (HibernateException e) { 
     e.printStackTrace(); 
     session.getTransaction().rollback(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    }  
    session.getTransaction().commit();  
    return location; 
} 

В другой функции я получаю объект местоположения и I пытаюсь получить доступ к location полей:

Location location = mainManager.getLocationById(idSearchedLocation); 
System.out.println(location.getLat() + " " +this.getClass().getName()); 

И тогда я получаю исключение после того, как я получаю возвращенное местоположение, когда я пытаюсь напечатать location.getLat():

org.hibernate.LazyInitializationException: could not initialize proxy - no Session 

Странно, почему я получаю эту ошибку, потому что объект Location имеет соседние коллекции и ассоциированные объекты: только String и Float типов.

Если я раскомментирую строку, которая печатает location.getLat() в функции dao, все работает так, как ожидалось, загружает все (без исключения, и печать преуспевает). Но почему Hibernate не загружает поля объекта в первом случае?

ОБНОВЛЕНИЕ

@Entity 
@Table(name="location") 
public class Location { 
    private Long id; 
    private String name; 
    private String country; 
    private String address; 
    private Float lat; 
    private Float lng; 
    //getters and setters 
} 
+0

Отправьте свой объект местоположения, пожалуйста. –

+0

@Ean Я обновил сообщение. –

+0

Hibernate загружает примитивные типы по умолчанию, если вы не отметите их как ленивые. Посмотрите на своих геттеров, чтобы убедиться, что вы отметили их как ленивые. Это можно сделать для примитивов с использованием аннотации @Basic. –

ответ

0

Hibernate.initialize(location) было решение.

Кажется, что Hibernate lazy загружает не только коллекции, но и каждый объект (называемый прокси).