2013-10-12 21 views
0

當Hibernate不會帶來持久化對象的封裝類型字段我有一個功能,只需通過ID獲取位置:使用load(類ID)

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; 
} 

在其他功能我得到的位置對象和我嘗試訪問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對象確實比較有集合,也沒有關聯實體:只有StringFloat類型。

如果我取消在dao函數中打印location.getLat()的行的註釋,所有行都按預期工作,它會加載所有內容(沒有例外,並且打印成功)。 但是爲什麼Hibernate不在第一種情況下加載對象的字段?

UPDATE

@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默認加載基本類型,除非將它們標記爲懶惰。看看你的getter,看看你是否標記爲懶惰。這可以使用@Basic註解來完成。 –

回答

0

Hibernate.initialize(location)是溶液。

看來,Hibernate懶惰加載不僅集合,而且每個對象(稱爲代理)。