有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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对象没有集合也没有关联的实体:只有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) 个答案

  1. # 1 楼答案

    Hibernate.initialize(location)是解决办法

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