繁体   English   中英

Vaadin中的休眠会话错误

[英]Hibernate session error in Vaadin

我正在使用带有Hibernate 4.3的JPAContainer开发Vaadin Webapp。 我遵循了此链接的说明,并成功实现了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它会自动打开一个会话,但是它给出了严重警告:

    “无法关闭用于加载与没有会话相关联的延迟收集的临时会话”

另外,当我从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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM