`
阅读更多

 org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags异常

 

我的User中开始的时候已经有了一个@ManyToMany了,具体配置如下:

 

@ManyToMany(fetch = FetchType.EAGER)
    @NotFound(action = NotFoundAction.IGNORE)
    @JsonIgnore
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    @JoinTable(name = "user_role",joinColumns = {@JoinColumn(name = "user_id")},
            inverseJoinColumns = {@JoinColumn(name = "role_id")})
    public List<Role> getRoleList() {
        return roleList;
    }

 运行程序完全正常。可是当我再在User中再添加了一个@ManyToMany,结果就出现了以上异常:

 

 org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags。

 

    @ManyToMany(fetch = FetchType.EAGER)
    @NotFound(action = NotFoundAction.IGNORE)
    @JsonIgnore
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    @JoinTable(name = "user_menu",joinColumns = {@JoinColumn(name = "user_id")},
            inverseJoinColumns = {@JoinColumn(name = "menu_id")})
    public List<Menu> getMenuList() {
        return menuList;
    }

 然后,在网上查找了一下资料,发现了问题所在:

 

1.当一个实体类中需要映射两个集合实体的时候,只允许有一个集合实体的fetch的FetchType设置为EAGER,另外的一个设置为LAZY;或者也可以用@IndexColumn。

2.在其中一个get方法上做如下注解:

@ManyToMany(fetch = FetchType.EAGER)
    @Fetch(value=FetchMode.SUBSELECT)
    @NotFound(action = NotFoundAction.IGNORE)
    @JsonIgnore
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    @JoinTable(name = "user_menu",joinColumns = {@JoinColumn(name = "user_id")},
            inverseJoinColumns = {@JoinColumn(name = "menu_id")})
    public List<Menu> getMenuList() {
        return menuList;
    }

 3.还有一种方法就是,将另一个list集合改为Set集合。

 

最后,看看FetchTypeFetchMode 的区别:

两者都是设定关联对象的加载策略。

FetchType是JPA标准的通用加载策略注解属性,FetchMode 是Hibernate自有加载策略注解属性。

FetchType可选值意义与区别如下:

FetchType.LAZY: 懒加载,在访问关联对象的时候加载(即从数据库读入内存)

FetchType.EAGER:立刻加载,在查询主对象的时候同时加载关联对象。

FetchMode可选值意义与区别如下:

@Fetch(FetchMode.JOIN): 始终立刻加载,使用外连(outer join)查询的同时加载关联对象,忽略FetchType.LAZY设定。

@Fetch(FetchMode.SELECT) :默认懒加载(除非设定关联属性lazy=false),当访问每一个关联对象时加载该对象,会累计产生N+1条sql语句

@Fetch(FetchMode.SUBSELECT)  默认懒加载(除非设定关联属性lazy=false),在访问第一个关联对象时加载所有的关联对象。会累计产生两条sql语句。且FetchType设定有效。 

0
1
分享到:
评论

相关推荐

    hibernate03:多对一单向关联、多对一双向关联

    本文主要探讨的是Hibernate中的两种关联关系:多对一单向关联和多对一双向关联。通过理解这两种关联方式,我们可以更好地设计和实现复杂的数据库模型。 首先,我们来看**多对一单向关联**。这种关联意味着一个实体...

    Spring+Hibernate注解事务实例

    下面我们将详细讲解如何配置和使用Spring+Hibernate注解声明式事务: 1. **配置Spring**: - 首先,我们需要在Spring配置文件中启用事务管理器,通常是`HibernateTransactionManager`,并配置数据源。 - 然后,...

    Hibernate一对一,一对多,多对多实例

    在Hibernate中,可以通过`@ManyToMany`注解定义多对多关系,并使用`@JoinTable`定义连接表。例如,Student实体和Course实体的多对多关系: ```java @Entity public class Student { @ManyToMany @JoinTable...

    hibernate注解功能模拟

    【hibernate注解功能模拟】这一主题主要涵盖了三个核心概念:Hibernate、Annotation(注解)和Reflection(反射)。在Java编程中,这三个概念对于理解对象关系映射(ORM)框架,尤其是Hibernate的工作机制至关重要。...

    Hibernate双向一对一关联映射(注解版)

    本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...

    Hibernate一对一关联映射(注解)

    综上所述,Hibernate的一对一关联映射通过注解方式提供了便捷的数据库表与Java对象之间的绑定,理解并正确使用这些注解对于优化数据访问性能、保证数据一致性至关重要。在设计数据库模型时,应充分考虑实体之间的...

    非注解Springmvc+spring+hibernate 入门实例

    虽然现在的最佳实践倾向于使用注解和Spring Boot,但理解非注解方式有助于深入学习这些框架的工作原理,对提升开发技能有长远的帮助。在实践中,你可能会遇到如何处理异常、如何进行事务管理、如何优化查询性能等...

    hibernate:一对多,多对多,一对一,乐观锁,二级缓存

    多对多关系常见于两个实体之间没有固定一对一或一对多关系的情况,如学生和课程。使用`@ManyToMany`注解,需要创建一个中间表(通常是联合主键)来存储两个实体的关联。`@JoinTable`注解用来定义中间表的详细信息。...

    spring mvc+hibernate 实现事务管理(全注解版)

    5. **异常与事务回滚**: 如果在@Transactional注解的方法中抛出未检查异常(继承自RuntimeException的异常)或者在@Transactional注解中明确列出的检查异常,Spring会自动回滚事务。否则,事务将在方法正常结束时...

    hibernate _annotation 注解编程

    - **关联相关注解**:如 `@JoinTable` 用于多对多关系的映射。 - **集合相关注解**:如 `@ElementCollection` 用于映射元素集合。 - **级联操作**:通过 `@Cascade` 注解来控制级联行为。 - **过滤器**:使用 `@...

    基于spring+springmvc+hibernate的全注解开发

    基于Spring+SpringMVC+Hibernate的全注解开发,允许开发者摆脱传统的XML配置文件,转而使用注解来实现组件的配置,大大简化了开发流程,提高了开发效率。 **Spring框架** 是一个全面的后端应用管理框架,它提供了...

    Hibernate 注解使用.docx

    `@Version` 注解用于实现乐观锁机制,当实体类中使用了此注解的属性发生更改时,会检查该属性的值是否与数据库中一致,如果不一致则抛出异常。 **示例:** ```java @Entity public class User { @Id private int...

    spring mvc + spring + hibernate 全注解整合开发视频教程 04

    在本视频教程“Spring MVC + Spring + Hibernate 全注解整合开发视频教程 04”中,我们将深入探讨Java企业级开发中的三大核心技术——Spring、Spring MVC和Hibernate的集成与应用,尤其是通过注解实现的简化配置。...

    hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了

    在本章中,我们将深入探讨Hibernate中的关联映射,包括一对多、多对一以及多对多的关系。这些映射关系对于理解如何在Java应用程序中有效地管理数据库对象至关重要。 首先,我们来解决描述中提到的问题。`...

    Hibernate 注解配置

    【Hibernate注解配置详解】 在Java的持久化框架中,Hibernate是一个非常重要的工具,它极大地简化了数据库操作。本文将深入探讨Hibernate的注解配置,包括实体类的注解、映射关系的定义以及事务管理等方面,帮助你...

    springmvc+spring+hibernate整合(注解)

    1. 创建实体类,使用Hibernate注解定义属性和关联关系。 2. 创建DAO接口和实现类,使用@Autowired注入SessionFactory,编写基本的CRUD操作。 3. 创建Service接口和实现类,定义业务逻辑,使用@Autowired注入DAO层。 ...

    Hibernate使用JPA注解代码

    当我们将Hibernate与JPA的注解结合使用时,可以极大地简化数据库操作的代码。然而,在实际开发中,我们可能会遇到各种问题,如标题中提到的"persistence.Table.indexes()[Ljavax/persistence/Index;"异常。这个异常...

    精通Hibernate:Java对象持久化技术详解(第2版)源码1

    2. **Chapter 3**: 深入讨论了实体类和数据表的映射,包括实体类的定义,属性与数据库字段的对应,以及一对一、一对多、多对多等关联关系的映射。这部分还可能涉及到了`@Entity`, `@Table`, `@Id`, `@GeneratedValue...

    springmvc+hibernate+注解

    4. **关系映射**: 包括一对一、一对多、多对一、多对多,通过`@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`等注解实现。 5. **会话和事务**: Session接口处理数据库交互,Transaction接口处理事务管理。 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版

    同时,关联关系如一对一、一对多、多对一、多对多也能通过@OneToOne、@OneToMany、@ManyToOne和@ManyToMany进行定义。 3. Hibernate配置:学习如何配置Hibernate,包括hibernate.cfg.xml文件的编写,数据库连接参数...

Global site tag (gtag.js) - Google Analytics