Hibernate 4.3 到 5.2 升级 - 不能同时获取多个包

Posted

技术标签:

【中文标题】Hibernate 4.3 到 5.2 升级 - 不能同时获取多个包【英文标题】:Hibernate 4.3 to 5.2 upgrade - cannot simultaneously fetch multiple bags 【发布时间】:2017-08-20 01:36:20 【问题描述】:

尝试从 4.3.11 升级到休眠 5.2.9。目前使用的是hibernate原生api。在 pom.xml 中添加依赖项后,运行单元测试时出现以下错误:

通过字段“sessionFactory”表示的不满足的依赖关系;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建类路径资源 [testApplicationContext.xml] 中定义的名称为“sessionFactory”的 bean 时出错:调用 init 方法失败;嵌套异常是 org.hibernate.loader.MultipleBagFetchException: 不能同时获取多个包

我有一个 testApplicationContext.xml,其中包含以下内容:

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan" value="org.xxxx.xxxx.xxxx.model"/>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">$hibernate.dialect</prop>
            <prop key="hibernate.show_sql">$hibernate.show_sql</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.use_sql_comments">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>
</bean>

<bean id="transactionManager"
    class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

我将 sessionFactory 和 transactionManager 从 hibernate4 更新为 hibernate5。

pom.xml

<dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.2.9.Final</version>
    </dependency>

据我所知,错误消息暗示加载多个急切加载的集合时出现问题。但是,我从this 了解到,使用特定于休眠的注释和更新版本的休眠支持此用例。

有人可以帮忙吗?谢谢

【问题讨论】:

【参考方案1】:

这个问题现在已经解决了。

在我的几个实体中,我将List 用于@OneToMany

更改为 Set 导致错误消失。尚不确定为什么在 Hibernate 4.3.11 而不是 5.2.9 中有效/受支持。如果我发现任何进一步的信息,我会更新这个答案。

有关ListSet 的更多信息,请访问here 和here。

【讨论】:

我有这种方式 @ManyToMany( cascade = CascadeType.PERSIST, CascadeType.MERGE ) @JoinTable(name = "usuario_bodega", joinColumns = @JoinColumn(name = "id_usuario"), inverseJoinColumns = @JoinColumn(name = "id_bodega")) 私人收藏 listaBodega = new ArrayList();我没有列表 我有收藏 将 List 替换为 Set 的解决方案确实有效,但它的影响是什么?我们的项目中有超过 1000 个列表映射。我们需要添加@OrderBy 还是取决于用例? getter setter 仍然返回 List 的副作用是什么,因为我们现在应该执行 Lists.newArrayList() 而不是之前返回对同一集合的引用?谢谢!

以上是关于Hibernate 4.3 到 5.2 升级 - 不能同时获取多个包的主要内容,如果未能解决你的问题,请参考以下文章

Rails 5.2 和 webpacker 3.4.3:部署到 Heroku 时资产未编译

Spring 4 with hibernate 5.2 Configuration(将hibernate 4移动到5.2):无法启动tomcat服务器

laravel 升级到 5.2

Spring Data JPA 1.9.2 + Hibernate 4.3+ 问题

升级到 4.3 后的 ScreenshotClient 错误

使用 Hibernate 5.2 以流形式查询结果