使用Spring Data和HIbernate JPA进行延迟加载

时间:2015-03-24 02:03:49

标签: java spring hibernate jpa spring-data-jpa

我正在使用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;

任何答案都很好。

问候。

2 个答案:

答案 0 :(得分:5)

通常情况下,不应该根据你所做的事情急切地抓住它。

recordings应该是一个延迟加载代理,只在需要时才会触发加载。

然而,偶然触发延迟加载是一个常见的错误:

  1. 您可能在代码中意外访问了该字段,例如toString() / hashCode() / equals()
  2. 您正在通过调试器检查对象状态,调试器将依次触发toString()或访问延迟加载字段。
  3. 我强烈建议您打开SQL加载并检查何时触发延迟加载。像JdbcDsLog这样的工具甚至只需打开Hibernate的SQL记录器就可以了解

答案 1 :(得分:-1)

默认情况下,Hibernate会在不在集合中时获取相关对象。 FetchType只是一个提示。原因是因为通常Hibernate必须加载对象以确定该字段是否应为NULL。如果该字段是一个集合,那么该集合可以始终为非NULL,因此Hibernate可以使用将按需加载的代理替换该集合。但是对于单个对象,没有办法放置代理,可以将NULL返回给getter。