hibernate oneToMany 记录重复 和异常org.hibernate.LazyInitializationException: failed to lazily initializ

本文介绍了一个关于Hibernate结合Spring框架时出现的多对一关系映射问题,即在一个父记录下出现多个子记录时,查询结果出现了重复记录的情况。通过调整FetchType为LAZY并最终采用FetchMode.SUBSELECT解决了此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:最近项目中使用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)

 

参考文章:

https://blog.youkuaiyun.com/g535879/article/details/43970641

https://blog.youkuaiyun.com/xu180/article/details/53396750

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值