Hibernate OneToMany双向关系很慢

时间:2013-05-15 09:52:22

标签: java hibernate one-to-many bidirectional

我有SessionsUsers个类,其中包含bi-directional OneToMany映射(使用hibernate逆向工程工具生成):

public class Users {
    @OneToMany(fetch=FetchType.LAZY, mappedBy="users")
    public Set<Sessions> getSessionses() {
        return this.sessionses;
    }
}

public class Sessions {
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="USER_ID")
    public Users getUsers() {
        return this.users;
    }
}

这是我为用户创建新会话的代码:

Session s = ...;
Users user = (Users) s.createCriteria(Users.class)
             ./*restrictions...*/.uniqueResult();
Sessions userSession = new Sessions();
userSession.setUsers(user);
s.save(userSession);
user.getSessionses().add(userSession); // here getSessionses() has 2k records

用户有2k会话,因此最后一行非常慢。

如何在不提取整个会话集合的情况下将会话与用户链接?

2 个答案:

答案 0 :(得分:3)

查看Hibernate的extra-lazy loading功能。 您可以使用@LazyCollection(LazyCollectionOption.EXTRA)为您的收藏集注释来启用它。需要this example查看,this one中使用了Set

public class Users {
    @OneToMany(fetch=FetchType.LAZY, mappedBy="users")
    @LazyCollection(LazyCollectionOption.EXTRA)
    public Set<Sessions> getSessionses() {
        return this.sessionses;
    }
}

答案 1 :(得分:1)

我不确定hibernate是否会以两种方式添加此连接,而不是将Session添加到User设置User的{​​{1}}。这样您就不必加载每个会话。