我正在使用SpringData和Hibernate执行一些测试,并在延迟加载和findBy ...方法上发现了一些有趣的行为。
我在子类上有以下方法。
列出findByArtistCredit(Long artistCreditId);
以及Recording和ArtistCredit之间的以下映射...
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="artist_credit" , referencedColumnName="artist_credit_id")
private ArtistCredit artistCreditReference;
在" One"一边......
@OneToMany(fetch=FetchType.LAZY,mappedBy="artistCreditReference")
private Set<Recording> recordings;
所发生的事情是&#34;许多方面的收集&#34;正在急切地想要......
有谁知道&#34;为什么会发生?&#34;
任何答案都很好。
问候。
答案 0 :(得分:5)
通常情况下,不应该根据你所做的事情急切地抓住它。
recordings
应该是一个延迟加载代理,只在需要时才会触发加载。
然而,偶然触发延迟加载是一个常见的错误:
toString()
/ hashCode()
/ equals()
。toString()
或访问延迟加载字段。我强烈建议您打开SQL加载并检查何时触发延迟加载。像JdbcDsLog这样的工具甚至只需打开Hibernate的SQL记录器就可以了解
答案 1 :(得分:-1)
默认情况下,Hibernate会在不在集合中时获取相关对象。 FetchType只是一个提示。原因是因为通常Hibernate必须加载对象以确定该字段是否应为NULL。如果该字段是一个集合,那么该集合可以始终为非NULL,因此Hibernate可以使用将按需加载的代理替换该集合。但是对于单个对象,没有办法放置代理,可以将NULL返回给getter。