我知道这个问题已被问到很多,但我找不到解决问题的方法。所以我有一个名为CurrentUser
的托管bean,它拥有一个Users
实例,在登录时,我保存了该实例中当前登录的用户,这是登录方法:
public static Users login(String username, String password) {
Session session = HibernateUtil.getSessionFactory().openSession();
session.getTransaction().begin();
try {
Criteria criteria = session.createCriteria(Users.class);
criteria.add(Restrictions.eq("username", username));
criteria.add(Restrictions.eq("password", password));
List<Users> list = criteria.list();
try {
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
if (session.isOpen()) {
session.close();
}
}
if (list.isEmpty()) {
return null;
} else {
new Logs(null, "Logging in", "/login.xhtml", "", list.get(0)).add();
return list.get(0);
}
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
if (session.isOpen()) {
session.close();
}
return null;
}
}
因此,此用户有一个expertise
懒惰映射的集合:
@OneToMany(mappedBy = "user")
@NotFound(action = NotFoundAction.IGNORE)
@Cascade({org.hibernate.annotations.CascadeType.REPLICATE, CascadeType.SAVE_UPDATE, CascadeType.MERGE})
private List<Expertise> expertises;
在另一个托管bean中,我注入了currentUser实例,但是当我尝试获得专业知识时,我得到了collection is not associated with any session
异常,
这是我的get方法:
public List<Expertise> getExpertises() {
Hibernate.initialize(expertises);
if (expertises != null) {
return expertises.stream().distinct().collect(Collectors.toList());
}
return null;
}
当我删除Hibernate.initialize
时,我得到org.hibernate.LazyInitializationException
,即使我的配置文件中有able_lazy_load_no_trans">true</property>
。
所以我的问题是我做错了什么,以及如何正确初始化一个惰性集合并检索它。或者我应该坚持下去。
更新:
将@LazyCollection(LazyCollectionOption.TRUE)
添加到集合中就可以了,但它真的很懒惰吗?它真的只在需要时加载列表吗?