JPA Annotation ElementCollection在Spring引导中渴望获取



我在spring-boot中急切地获取时遇到了一个小问题。基本上,我有一个实体定义为:

@Entity
class EventEntry(
@ID
val uid 
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "event_to_boxes", joinColumns = arrayOf(JoinColumn(name = "event_uid")))
@Column(name = "box_uid")
val boxUids: List<Long>
) : EventEntry(userUid, timestamp)

现在,当我插入数据(来自graphql,但这是一个细节(时,一切都很好,我可以看到在数据库上,event_to_boxes表上正确地保留了多行。不幸的是,当我检索所有事件时,突然出现了一些意想不到的事情。

我看到的是询问所有事件,然后询问每个boxUid列表一次,就好像FetchType.EAGER被完全忽略了一样。

我的理解是,在填充事件实体时,fetch-type-archive应该已经获得了框uid的值。我错过了什么吗?还是我的理解完全错误了?

为了提供更多的背景信息,我试图以这种方式对N对N关系进行建模,其中这是N关系的一半,但我必须,在获取事件实体时,也会显示框uid(框是关系的另一半(,而不需要任何额外的框数据

如hibernate文档中所述,FetchType.EAGER仅适用于直接实体获取:

EventEntry eventEntry = entityManager.find(EventEntry.class, 1L);

LEFT JOIN子句被添加到生成的SQL查询中,因为需要急切地获取此关联。

另一方面,如果您使用的实体查询不包含JOIN FETCH指令。。。

Hibernate使用辅助选择。这是因为实体查询获取策略不能被覆盖,因此Hibernate需要一个辅助选择,以确保在将结果返回给用户之前获取EAGER关联。

如果您忘记了JOIN FETCH所有EAGER关联,Hibernate将为每一个关联发出二次选择,这反过来会导致N+1查询问题。

出于这个原因,你应该更喜欢LAZY协会。

最新更新