使用load(class,id)时,Hibernate不会带来持久对象的Wrapper类型字段

时间:2013-10-12 20:00:16

标签: java hibernate load lazy-initialization

我有一个只能通过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对象更新有集合或关联实体:只有StringFloat类型。

如果我取消注释在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 个答案:

答案 0 :(得分:0)

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

似乎Hibernate懒惰不仅加载集合而且加载每个对象(称为代理)。