Java 使用Spring数据和HIbernate JPA延迟加载
我正在用SpringData和Hibernate进行一些测试,发现了一些关于延迟加载和findBy的有趣行为。。。方法 我在子类上有以下方法 列表findByArtistCredit(长artistCreditId) 下面是录制和ArtistCredit之间的映射Java 使用Spring数据和HIbernate JPA延迟加载,java,spring,hibernate,jpa,spring-data-jpa,Java,Spring,Hibernate,Jpa,Spring Data Jpa,我正在用SpringData和Hibernate进行一些测试,发现了一些关于延迟加载和findBy的有趣行为。。。方法 我在子类上有以下方法 列表findByArtistCredit(长artistCreditId) 下面是录制和ArtistCredit之间的映射 @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="artist_credit" , referencedColumnName="artist_credit_id") private
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="artist_credit" , referencedColumnName="artist_credit_id")
private ArtistCredit artistCreditReference;
在“一”方面
@OneToMany(fetch=FetchType.LAZY,mappedBy=“artistCreditReference”)
私人录音;
发生的事情是,“多方面”的收藏正被急切地取走
有人知道“为什么会这样吗?”
任何答案都是好的
注意。默认情况下,当相关对象不在集合中时,Hibernate将获取它们。FetchType只是一个提示。原因是正常休眠必须加载对象,以确定字段是否应为NULL。如果该字段是一个集合,那么该集合可以始终为非NULL,因此Hibernate可以使用一个代理来替换该集合,该代理将按需加载。但是对于单个对象,没有办法放置一个可以将NULL返回给getter的代理。通常,不应该根据您所做的操作急切地获取代理
录制
应该是一个延迟加载代理,只有在需要时才会触发加载
但是,意外触发延迟加载是一个常见错误:
toString()
/hashCode()
/equals()
中toString()
或对延迟加载字段的访问我强烈建议您打开SQL加载,并检查何时触发延迟加载。像JdbcDsLog这样的工具,甚至只是打开Hibernate的SQL记录器,应该会有所帮助据我所知,这不是真的。您可以很好地在
…ToOne
关系上定义FetchType.LAZY
,有效地打破查询中的连接fetch
。这是有道理的,因为外键列在数据库中有一个null
值。这个答案显然是错误的(而且不相关)。从逻辑上讲,对于单个对象(xxxToOne),该“一”侧的ID将在“多”侧的记录中。当为“多”端检索数据时,Hibernate已经有关于FK是null(因此给出null对象ref)还是包含值(因此它为其生成代理)的信息,因此,如果这是错误的,那么如果值是延迟加载的,那么这个单值字段的getter如何返回null呢。实现延迟加载的正常过程是使用代理替换容器,该代理在取消引用容器时加载内容。如果字段中引用的对象被代理替换,那么getter将永远不会返回NULL。它将始终返回代理。如果getter返回NULL,那么就没有代理延迟加载实际对象。
@OneToMany(fetch=FetchType.LAZY,mappedBy="artistCreditReference")
private Set<Recording> recordings;