JPA的cannot simultaneously fetch

2019-01-26  本文已影响0人  树蜂

在springboot中使用jpa,参照 Spring Boot整合jpa,Shiro进行权限管理 写的程序,在每个记录中添加修改用户,

@ManyToOne(fetch=FetchType.EAGER)
private UserInfo alterUser

在启动程序是,报

cannot simultaneously fetch multiple bags异常

解决办法

将@ManyToOne或@ManyToMany的容器由List改为Set

具体原因参照 JPA的cannot simultaneously fetch multiple bags异常的解决
注意文章是2009年发表的,感觉自己穿越了,基础知识真重要。
下面是原文:
cannot simultaneously fetch multiple bags异常是由于持久层实时加载太多异同对象而致。例如用户登录时,同步实时加载用户的角色对象、权限对象,而往往这些关系都是多对多关系,就单一列内容来看存在重复的值,从而引起multiple bags。我在网上搜索这类结果,几乎都提出一个解决办法——采用延迟加载,即fetch=FetchType.LAZY,这样就束缚了框架的强大功能,也有提过用@IndexColumn解决,但@IndexColumn是Hibernate的东西,不是JPA规范(下文有讨论)。既要实时加载,又保证不会出现主题问题,这就是本文所要探讨的。

JPA规范中,一对多或多对多的多方数据抓取过来后必须用容器类存,例如Set、List、Map等,初学者可能没有对这个几个容器认真研究,随便拿一个就用。事实上这几个容器有很大的区别,本文不具体讨论这些容器的区别和功能,但提一个特别要注意的区别——导致本文主题的产生——就是容器内是否允许重复值,那让们简单地了解下这此容器的特性:

上一篇下一篇

猜你喜欢

热点阅读