我有Sessions
和Users
个类,其中包含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会话,因此最后一行非常慢。
如何在不提取整个会话集合的情况下将会话与用户链接?
答案 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}}。这样您就不必加载每个会话。