如何正确初始化延迟集合“集合与任何会话无关”

时间:2016-02-04 14:42:09

标签: java hibernate collections lazy-initialization

我知道这个问题已被问到很多,但我找不到解决问题的方法。所以我有一个名为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)添加到集合中就可以了,但它真的很懒惰吗?它真的只在需要时加载列表吗?

0 个答案:

没有答案