我以这样一种方式进行了JPA设置:如果我不使用延迟加载,则几乎将加载整个数据库。我也直接在模型上使用序列化,因此有时我需要初始化代理。
我只想在集合上使用延迟加载。急切地获取一些奇异实体的事实就很好了。但是,无论我如何尝试设置集合,我都永远不会得到代理集合,而我总是会得到完全加载的集合。
这是一些示例代码:
@Entity public class Thread implements Externalizable { @OneToMany(mappedBy = "parentThread", fetch = FetchType.LAZY) public List<Reply> getReplies() { return replies; }
所以这里的问题是,当我检查调试器时,答复的persistantBag-list始终充满信息,并且是实际的答复对象,而不是我想要的空代理。
当我想要线程时,无论是否具有fetch = FetchType.LAZY,我都始终使用完全加载的entityManager.find(Thread.class,“ ID”)。
据我了解,设置fetchtype lazy应该可以按我的意愿工作。另外,我希望在使用thread.getReplies()时加载实体,以便可以序列化并将其发送到客户端。我不知道getReplies是否可以与代理实体一起工作,因为我从来没有延迟加载任何集合。
一方面,我不使用Intellij并将其用于通过Hibernate设置JPA。我也曾问过一个类似的问题,我希望集合完全为空,但是我不确定这是否可行,因此我要问这个问题。
对于这个关于stackoverflow的基本问题,我还没有看到一个好的答案。如果由于我是JPA / Hibernate和数据库的新手,那么如果确实以教学法回答了该问题,请仅通过链接回复。
提前非常感谢您!
惰性集合不包含代理。该集合本身是一个延迟加载的集合。这意味着当您从数据库中获取线程时,其回复列表将不会初始化。
调用getReplies()将仅返回此未初始化的列表。只有在调用列表本身的方法(如size()或iterator())时,Hibernate才会通过执行SQL查询来初始化列表,该查询加载线程的所有回复的状态。
getReplies()
size()
iterator()
使用调试器检查集合中包含的内容不是一个好主意,因为调试器通常在背后的列表上调用方法,这会导致列表初始化。您可以检查是否使用Hibernate.isInitialized(thread.getReplies())方法初始化了集合。
Hibernate.isInitialized(thread.getReplies())
关于另一个问题:Hibernate用于将数据库行映射到对象。如果某个线程有回复,则Hibernate不会通过向您返回一个空列表来告诉您它没有任何线程。那将是一个严重的错误。如果您不想加载回复,只需不要在回复列表中调用任何方法。