我有一个包含以下内容的实体:
@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无法一次性获取多个集合。但是,如果我将List
to Set
和LinkedList
to
更改为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查询结果时,没有简单的方法来判断哪个子元素属于哪个集合。有关示例的更多详细说明。总结一下,您有以下解决方法:
@Fetch(FetchMode.SELECT)
@IndexColumn(name="LIST_INDEX")
问题内容: 有没有一种方法可以将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:已注