0

我有一个简单地通过 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类型。

如果我取消注释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
}
4

1 回答 1

0

Hibernate.initialize(location)是解决方案。

似乎 Hibernate 延迟加载不仅是集合,而且是每个对象(称为代理)。

于 2013-10-13T22:33:54.003 回答