Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Spring数据和HIbernate JPA延迟加载_Java_Spring_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

Java 使用Spring数据和HIbernate JPA延迟加载

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

我正在用SpringData和Hibernate进行一些测试,发现了一些关于延迟加载和findBy的有趣行为。。。方法

我在子类上有以下方法

列表findByArtistCredit(长artistCreditId)

下面是录制和ArtistCredit之间的映射

@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;