gpt4 book ai didi

java - Vaadin 中的 Hibernate session 错误

转载 作者:行者123 更新时间:2023-12-01 12:25:15 26 4
gpt4 key购买 nike

我正在使用 JPAContainer 开发 Vaadin Web 应用程序与 hibernate 4.3。我按照这个link的说明进行操作并成功实现了 EntityManager-per-Request 模式。这意味着延迟加载与 JPAContainer 配合得很好

但是,每次我需要使用纯 JPA 时,它都无法延迟加载。

这里是一个示例代码:

 try {
entityManagerProvider.getEntityManager().getTransaction().begin();

List<SubEntity> subEntitiesList = myEntity.getCollectionOfEntities(); //Fails to load

for (SubEntity subEntity : subEntitiesList) {
subEntity.doSomething();
entityManagerProvider.getEntityManager().merge(subEntity);
}
entityManagerProvider.getEntityManager().flush();
entityManagerProvider.getEntityManager().getTransaction().commit();
} catch (Exception ex) {
entityManagerProvider.getEntityManager().getTransaction().rollback();
}

//datasource is JPAContainer<MyEntity> type
datasource.removeItem(index);

我尝试过以下解决方案:

  1. 使用 hibernate.enable_lazy_load_no_trans它自动打开了一个 session ,但它给出了严重警告:

    “无法关闭用于加载与无 session 关联的惰性集合的临时 session ”

此外,当我从 JPAContainer 中删除实体时,我收到错误:org.hibernate.PersistentObjectException:已分离实体传递给持久化

有人可以给我一些关于如何处理这个问题的提示吗?

最佳答案

我看到两种方法。

将分离实体的更改合并到数据库

只需合并实体并对托管值进行操作即可。

Entity managed = em.merge(entity);

for (SubEntity sub : managed.getSubEntities()) {
sub.doSomething();
}

在不接触数据库的情况下解决惰性代理

通过 ID 查找实体并将属性复制到分离的实体。

Entity managed = em.find(entity.getClass(), entity.getId());
entity.setSubEntities(managed.getSubEntities());

对于第二个选项,我编写了一个通用实用方法来将分离实体初始化到一定深度也许您会发现它很有用。

// initialize lazy collections and collection elements
JpaUtils.initialize(em, entity, 2);

参见JpaUtils获取源代码。

关于java - Vaadin 中的 Hibernate session 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26406393/

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