Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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 JPA Hibernate集合未延迟加载_Java_Hibernate_Jpa_Lazy Loading_One To Many - Fatal编程技术网

Java JPA Hibernate集合未延迟加载

Java JPA Hibernate集合未延迟加载,java,hibernate,jpa,lazy-loading,one-to-many,Java,Hibernate,Jpa,Lazy Loading,One To Many,我有一个JPA设置,如果我不使用延迟加载,几乎整个数据库都将被加载。我还直接在模型上使用序列化,因此有时需要初始化代理 我只想对集合使用延迟加载。事实上,一些单一的实体被急切地抓取,效果很好。但无论我如何设置集合,我都不会得到代理集合,我总是得到完全加载的集合 以下是一些示例代码: @Entity public class Thread implements Externalizable { @OneToMany(mappedBy = "parentThread", fetch = Fe

我有一个JPA设置,如果我不使用延迟加载,几乎整个数据库都将被加载。我还直接在模型上使用序列化,因此有时需要初始化代理

我只想对集合使用延迟加载。事实上,一些单一的实体被急切地抓取,效果很好。但无论我如何设置集合,我都不会得到代理集合,我总是得到完全加载的集合

以下是一些示例代码:

@Entity
public class Thread implements Externalizable {
    @OneToMany(mappedBy = "parentThread", fetch = FetchType.LAZY)
    public List<Reply> getReplies() {
        return replies;
    }
@实体
公共类线程实现了外部化{
@OneToMany(mappedBy=“parentThread”,fetch=FetchType.LAZY)
公共列表getReplies(){
回复;
}
所以这里的问题是,当我检查调试器时,persistantBag回复列表总是充满信息,并且是实际的回复对象,而不是我想要的空代理

当我需要线程时,我使用entityManager.find(Thread.class,“ID”),并且无论我是否具有fetch=FetchType.LAZY,像这样的所有集合总是完全加载

据我所知,设置fetchtype lazy应该按我所希望的那样工作。此外,我希望在使用thread.getReplies()时加载实体,以便我可以序列化并将它们发送到客户端。我不知道getReplies是否可以与代理实体一起工作,因为我从未得到任何要延迟加载的集合

另一方面,我使用Intellij并用它来设置带有Hibernate的JPA。 我还问了一个类似的问题,我希望收藏完全为空,但我不确定这是否可行,因此我提出了这个问题

关于stackoverflow这个看似基本的问题,我还没有看到一个好的答案。由于我对JPA/Hibernate和真正的数据库都不熟悉,因此,如果这个问题的答案真的是以教学的方式给出的,请仅用一个链接来回答


非常感谢您!

延迟集合不包含代理。集合本身是延迟加载的集合。这意味着当您从数据库获取线程时,其回复列表将不会初始化

调用
getReplies()
只会返回这个未初始化的列表。只有在调用列表本身的方法(如
size()
iterator()
)时,才会通过执行SQL查询加载线程的所有回复的状态来休眠初始化列表

使用调试器检查集合包含的内容不是一个好主意,因为调试器通常会在您背后调用列表上的方法,这会导致列表自身初始化。您可以使用该方法检查集合是否已初始化


关于您的另一个问题:Hibernate用于将数据库行映射到对象。如果线程有回复,Hibernate将不会通过返回空列表来告诉您它没有回复。这将是一个严重的错误。如果您不想加载回复,只需不调用回复列表上的任何方法即可。

惰性集合不会包含代理。集合本身是延迟加载的集合。这意味着当您从数据库获取线程时,其回复列表将不会初始化

调用
getReplies()
只会返回这个未初始化的列表。只有在调用列表本身的方法(如
size()
iterator()
)时,才会通过执行SQL查询加载线程的所有回复的状态来休眠初始化列表

使用调试器检查集合包含的内容不是一个好主意,因为调试器通常会在您背后调用列表上的方法,这会导致列表自身初始化。您可以使用该方法检查集合是否已初始化


关于您的另一个问题:Hibernate用于将数据库行映射到对象。如果线程有回复,Hibernate将不会通过返回空列表来告诉您它没有回复。这将是一个严重的错误。如果您不想加载回复,只需不调用回复列表上的任何方法即可。

谢谢!抱歉接受你的答案=)我错过了调试器实际调用我背后的方法,这导致了我的困惑。谢谢!很抱歉忘记接受你的答案=)我错过了调试器实际调用我背后的方法,这导致了我的困惑。