当前位置: 首页 > 面试题库 >

使用JPA在Hibernate中使用EAGER类型的多次获取

罗翰
2023-03-14
问题内容

我有一个包含以下内容的实体:

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "assessment")
@OrderBy(value = "order ASC")
private List<AssessmentPart> assessmentParts = new LinkedList<>();

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "assessment")
private List<AssessmentText> texts = new LinkedList<>();

如您所见,有两个集合需要急切加载。这不起作用,并且hibernate会引发异常:

Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags

这是因为Hibernate无法一次性获取多个集合。但是,如果我将Listto SetLinkedListto
更改为HashSet这部分效果很好,但另一个问题发生了。

当我尝试使用以下方法从数据库中获取实体时:

entityManager.find(entityClass, primaryKey);

它失败并显示:

org.hibernate.AssertionFailure: null identifier

我确定传递给find方法的ID 不为null,我已经调试了,并且对此有把握。它以某种方式消失在hibernate状态。

如果我将集合类型更改为LAZY所有类型,则一切正常,没有错误,但是在某些情况下需要使用EAGER

有人有解决方案吗?我可以有一个集合,但可以防止发生断言错误,或者我可以有一个列表,但是以某种方式避免了多个提取包错误。

我在用:

Hibernate 4.2.2.Final
Tomcat 7
JPA 2.0
JDK 1.7

编辑

我刚刚发现,添加可以@Fetch(FetchMode.SELECT)解决该问题,并且可以使用带有EAGER类型的多个列表,但是仍然可以通过不使用特定于Hibernate的注释来解决此问题吗?以及为什么它首先解决了这个问题?


问题答案:

问题的根本原因在于,当Hibernate提取SQL查询结果时,没有简单的方法来判断哪个子元素属于哪个集合。有关示例的更多详细说明。总结一下,您有以下解决方法:

  • 使用subselect分别加载每个集合 @Fetch(FetchMode.SELECT)
  • 通过添加索引列来强制使用列表而不是bag @IndexColumn(name="LIST_INDEX")
  • 使用无序集合(如Set)。


 类似资料:
  • 问题内容: 有没有一种方法可以将Point列映射到Java实体字段? 我尝试了Hibernate Spatial 4.0,但似乎没有PostGIS的纯PostgreSQL就无法使用。这是点字段定义: persistence.xml中的方言: 当我尝试保留该实体时,会引发异常: 似乎它试图将值保留为PostGIS的Geometry类型。但是我只想使用简单的Point。 问题答案: 您应该尝试在数据库

  • 有没有办法将点列映射到Java实体字段? 我尝试了Hibernate空间4.0,但似乎它不适用于没有PostGIS的纯PostgreSQL。这里是点字段定义: persistence.xml方言: 当我尝试持久化这个实体时,会引发异常: 因此,它似乎试图将价值作为PostGIS的几何类型。但是我想用简单的Point。

  • 问题内容: 我有一个使用SchemaUpdate的主要方法,可以在控制台上显示要更改/创建的表,并且在我的Hibernate项目中可以正常工作: 我想在JPA项目中重用此代码,它没有hibernate.cfg.xml文件(也没有.properties文件),但是有一个persistence.xml文件(如JPA规范指定的在META- INF目录中自动检测到) 。 我尝试了这种过于简单的调整, 但由

  • 我似乎无法让我的Spring JPA配置正常工作。我有一个Spring REST服务。如果我将所有实体设置为FetchType.EAGER,一切都按预期工作。但是我不想这样做,原因很明显。 当我将实体设置为FetchType时。懒惰,我得到以下错误: org.hibernate.LazyInitializationException:未能懒惰地初始化角色集合:com.service.entitie

  • 问题内容: 在我看来,对多租户的支持现在已经hibernate了将近六个月,此后至少更新了一次。 在JPA之外获得多租户会话看起来相当琐碎: 但是,如何在通过JPA使用hibernate的应用程序中启用它呢?(如果可能的话)。 提前致谢。 问题答案: 您可以通过persistence.xml中的属性对其进行配置,如下所示: 如果使用SCHEMA,则不需要多租户策略。 您还可以在代码中设置这些属性,

  • 我正在使用Equinox Eclipse和Hibernate/JPA开发两个OSGI包,试图使用Unmanaged JPA持久化一个实体。 第一个捆绑包:“Testhibernate”是一个捆绑包,它从Hibernate罐中导出所有软件包,并具有一个激活器“org.hibernate.osgi.冬眠捆绑激活器”,它注册OSGI服务并使用Equinox标签Eclipse-BuddyPolicy:已注