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對象確實比較有集合,也沒有關聯實體:只有String
和Float
類型。
如果我取消在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
}
請發佈您的位置對象。 –
@Ean我更新了帖子。 –
Hibernate默認加載基本類型,除非將它們標記爲懶惰。看看你的getter,看看你是否標記爲懶惰。這可以使用@Basic註解來完成。 –