java Hibernate在使用load(类,id)时不带持久对象的包装器类型字段
我有一个函数,只需通过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
}
# 1 楼答案
Hibernate.initialize(location)
是解决办法Hibernate lazy似乎不仅加载集合,而且加载每个对象(称为代理)