[英]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);
我已经尝试过以下解决方案:
使用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.