Hibernate Spring boot中的JPA Annotation ElementCollection抓取

Hibernate Spring boot中的JPA Annotation ElementCollection抓取,hibernate,spring-boot,jpa,kotlin,Hibernate,Spring Boot,Jpa,Kotlin,我有一个小问题,在春季开机抓取急切。基本上,我有一个实体定义为: @Entity class EventEntry( @ID val uid @ElementCollection(fetch = FetchType.EAGER) @CollectionTable(name = "event_to_boxes", joinColumns = arrayOf(JoinColumn(name = "event_uid")))

我有一个小问题,在春季开机抓取急切。基本上,我有一个实体定义为:

@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)
@实体
类事件条目(
@身份证
液体
@ElementCollection(fetch=FetchType.EAGER)
@CollectionTable(name=“event\u to\u box”,joinColumns=arrayOf(JoinColumn(name=“event\u uid”))
@列(name=“box\u uid”)
val boxUids:列表
):EventEntry(userUid,时间戳)
现在,当我插入数据(来自graphql,但这是一个细节)时,一切都正常,我可以看到在数据库上,多行被正确地保存在event_to_box表中。 不幸的是,当我检索所有事件时,突然出现了一些意想不到的事情

我看到的是查询请求所有事件,然后请求每个boxuid列表一次,几乎就好像完全忽略了FetchType.EAGER一样

我的理解是,fetch类型eager在填充事件实体时应该已经获得box uid的值。 我错过了什么,或者我的理解完全错了


为了提供更多的背景信息,我尝试以这种方式对N-To-N关系进行建模,其中这是N-To-N关系的一半,但我必须在获取事件实体时,在没有任何额外的方框数据的情况下,也调出方框UID(方框是关系的另一半),如hibernate中所述,
FetchType.EAGER
仅适用于直接实体获取:

EventEntry EventEntry=entityManager.find(EventEntry.class,1L);
LEFT JOIN
子句添加到生成的SQL查询中,因为需要急切地获取此关联

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

Hibernate使用辅助选择。这是因为无法覆盖实体查询获取策略,因此Hibernate需要进行二次选择,以确保在将结果返回给用户之前获取
EAGER
关联

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

因此,您应该更喜欢惰性关联


您是否为BoxUID声明了getter setter?使用@JoinTable(name=“event\u to\u boxes”,joinColumns=@JoinColumn(name=“event\u uid”))@好奇:在kotlin中,getter是自动生成的,setter在val中是禁止的fields@Curiosity:不幸的是,它仍然会打很多不必要的电话。。似乎没有办法提供急切的加载:/