gpt4 book ai didi

java - 如何测试延迟加载的 JPA 集合是否已初始化?

转载 作者:IT老高 更新时间:2023-10-28 20:36:12 27 4
gpt4 key购买 nike

我有一个从外部代码获取 JPA 实体的服务。在此服务中,我想遍历一个延迟加载的集合,该集合是该实体的一个属性,以查看客户端是否向其添加了相对于数据库中当前版本的内容。

但是,客户端可能从未接触过该集合,因此它仍未初始化。这导致了众所周知的

org.hibernate.LazyInitializationException:延迟初始化角色集合失败:com.example.SomeEntity。

当然,如果客户从未接触过该集合,我的服务就不必检查它是否有可能发生的变化。问题是我似乎无法找到一种方法来测试集合是否已初始化。我想我可以在它上面调用 size() 如果它抛出 LazyInitializationException 我会知道,但我试图不依赖这种模式。

在某处有一些 isInitialized() 方法吗?

最佳答案

你在使用 JPA2 吗?

PersistenceUnitUtil 有两种方法可用于确定实体的加载状态。

例如组织和用户之间存在双向 OneToMany/ManyToOne 关系。

public void test() {
EntityManager em = entityManagerFactory.createEntityManager();
PersistenceUnitUtil unitUtil =
em.getEntityManagerFactory().getPersistenceUnitUtil();

em.getTransaction().begin();
Organization org = em.find(Organization.class, 1);
em.getTransaction().commit();

Assert.assertTrue(unitUtil.isLoaded(org));
// users is a field (Set of User) defined in Organization entity
Assert.assertFalse(unitUtil.isLoaded(org, "users"));

initializeCollection(org.getUsers());
Assert.assertTrue(unitUtil.isLoaded(org, "users"));
for(User user : org.getUsers()) {
Assert.assertTrue(unitUtil.isLoaded(user));
Assert.assertTrue(unitUtil.isLoaded(user.getOrganization()));
}
}

private void initializeCollection(Collection<?> collection) {
// works with Hibernate EM 3.6.1-SNAPSHOT
if(collection == null) {
return;
}
collection.iterator().hasNext();
}

关于java - 如何测试延迟加载的 JPA 集合是否已初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4306463/

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