这可能与其他一些帖子重复。但我试图运行控制台应用程序来了解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方法加载延迟对象?如果没有其他方式?
答案 0 :(得分:3)
这是否意味着我无法使用initialize加载惰性对象 会话结束后的方法?如果没有其他方式?
这正是它的含义。延迟加载意味着仅在您需要时加载对象,但这要求您仍然具有到数据库的实时连接(在会话内并且可能在事务内)。
关闭Session
后,无法初始化为延迟加载创建的代理。