我有一个只能通过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 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在第一种情况下没有加载对象的字段?
更新
@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)
Hibernate.initialize(location)
是解决方案。
似乎Hibernate懒惰不仅加载集合而且加载每个对象(称为代理)。