问题:最近项目中使用hibernate4+spring4进行数据库访问时,发现一个记录下有五个子项目时竟然返回五条重复记录。
初始环境:hibernate 每个用户对应一个小组 。user--group(many to one)。group--user(one to many)
Group代码片段
@OneToMany(mappedBy="group", fetch=FetchType.EAGER) @JoinColumn(name="groupid") public Set<User> getUsers() { return users; }
User代码片段
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="groupid")
public Group getGroup() {
return group;
}
当一个Group里有多个User时,查询处理的是多条记录,理想情况是一条记录;
初步解决方案:
修改Group中 FetchType.LAZY当使用时再查询;
但是在使用过程中,抛出新的异常:
org.hibernate.LazyInitializationException:42 - failed to lazily initialize a collection of role: com.hibernate.crud.Group.users, no session or session was closed
终极解决方案:
@OneToMany(cascade = CascadeType.ALL , fetch=FetchType.EAGER, mappedBy="xxx")
@Fetch(FetchMode.SUBSELECT)
参考文章: