会话关闭后Hibernate.initialize不起作用

时间:2014-03-09 02:44:33

标签: hibernate

这可能与其他一些帖子重复。但我试图运行控制台应用程序来了解hibernate初始化方法。我写下面的程序,但它对我不起作用。

public class Main {
public static void main(String[] args) {
    SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
    Session session2 = sessionFactory.openSession();
    Emp emp2 = (Emp)session2.load(Emp.class, 1);
    emp2.getEmail();
    session2.close();
    unproxy(emp2);
    System.out.println(emp2.getAddress());

}
@SuppressWarnings("unchecked")
public static <T> T unproxy(T entity) {
    if (entity == null) {
        return null;
    }
    System.out.println(entity.getClass());
    if (entity instanceof HibernateProxy) {
        Hibernate.initialize(entity);
        entity = (T) ((HibernateProxy) entity).getHibernateLazyInitializer().getImplementation();
    }
    return entity;
}

}

我正处于异常之下。

SEVERE: failed to lazily initialize a collection of role: com.sample.hibernate.Emp.address, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.sample.hibernate.Emp.address, no session or session was closed

这是否意味着在会话关闭后我无法使用initialize方法加载延迟对象?如果没有其他方式?

1 个答案:

答案 0 :(得分:3)

  

这是否意味着我无法使用initialize加载惰性对象   会话结束后的方法?如果没有其他方式?

这正是它的含义。延迟加载意味着仅在您需要时加载对象,但这要求您仍然具有到数据库的实时连接(在会话内并且可能在事务内)。

关闭Session后,无法初始化为延迟加载创建的代理。