gpt4 book ai didi

java - FetchType.LAZY 没有从数据库中获取对象

转载 作者:行者123 更新时间:2023-11-29 08:02:48 26 4
gpt4 key购买 nike

使用 JPA (EntityManager) 和 Hibernate。

我有一个包含 3 个集合的类,一个包含 FetchType.EAGER,另外两个包含 LAZY。如果我将其中的 3 个放在 EAGER 中,我会得到一个异常(exception),因为它只能有一个。这样,当我尝试使用 LAZY 列表之一时,出现异常:

no session or session was closed: javax.faces.el.EvaluationException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:

那么,当我要这 2 个集合时,我如何才能得到它们呢?

我的类(class):

public class Event implements....
....
....
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name="friendsList")
private List<Long> friends;
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name="carsList")
private List<Long> cars;
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name="housesList")
private List<Long> houses;

我试过了,还是不行

@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public IEvent synchronizeCarsList(IEvent companyToSynchronize){
if(companyToSynchronize == null)
throw new IllegalArgumentException();
if(entityManager != null) {
List<Long> cars = companyToSynchronize.getSelectedCarsIdList();

}
return companyToSynchronize;
}

编辑:当我在一个实体中有多个 EAGER 时部署异常(或者我从日志中了解到)

Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
at org.hibernate.loader.BasicLoader.postInstantiate(BasicLoader.java:94) [:3.6.6.Final]
at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:119) [:3.6.6.Final]
at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:71) [:3.6.6.Final]
at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:54) [:3.6.6.Final]
at org.hibernate.loader.entity.BatchingEntityLoader.createBatchingEntityLoader(BatchingEntityLoader.java:133) [:3.6.6.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:1914) [:3.6.6.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:1937) [:3.6.6.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.createLoaders(AbstractEntityPersister.java:3205) [:3.6.6.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.postInstantiate(AbstractEntityPersister.java:3191) [:3.6.6.Final]
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:348) [:3.6.6.Final]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872) [:3.6.6.Final]
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906) [:3.6.6.Final]
... 105 more

问候。

最佳答案

简单地为延迟加载的 Collection 赋值不足以触发加载。您将得到的只是对代理的引用。这就是事务外的访问会失败的原因。

Collection 上调用 .size(),同时仍在事务中,将触发加载,任何其他需要访问实际内容的方法也是如此。

关于java - FetchType.LAZY 没有从数据库中获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13380106/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com