我有一个简单地通过 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
类型。
如果我取消注释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
}