我想在数据库中复制实体集合。我使用以下方法检索该集合:
CategoryHistory chNew = new CategoryHistory();
CategoryHistory chLast = (CategoryHistory)em.createQuery("SELECT ch from CategoryHistory ch WHERE ch.date = MAX(date)").getSingleResult;
List<Category> categories = chLast.getCategories();
chNew.addCategories(categories)// Should be a copy of the categories: OneToMany
现在,我想复制“类别”列表,并使用EntityManager保留它。我正在使用JPA /hibernate。 更新
在知道如何分离我的实体之后,我需要知道要分离什么:当前代码:
CategoryHistory chLast = (CategoryHistory)em.createQuery("SELECT ch from CategoryHistory ch WHERE ch.date=(SELECT MAX(date) from CategoryHistory)").getSingleResult();
Set<Category> categories =chLast.getCategories();
//detach
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
session.evict(chLast);//detaches also its child-entities?
//set the realations
chNew.setCategories(categories);
for (Category category : categories) {
category.setCategoryHistory(chNew);
}
//set now create date
chNew.setDate(Calendar.getInstance().getTime());
//persist
em.persist(chNew);
这引发了failed to lazily initialize a collection of role: entities.CategoryHistory.categories, no session or session was closed
异常。
我认为他想重新加载类别,因为我已经将它们分离了。我现在该怎么办?
亚伦·迪吉拉(AaronDiguila)的答案是去这里的方式,即您需要detach
实例,将业务密钥设置为null
,然后再将persist
其设置为。
遗憾的是,无法使用JPA 1.x从实体管理器断开一个对象的连接(JPA
2.0将具有EntityManager.detach(Object)
并修复此问题)。因此,要么等待JPA
2.x(我猜不是一个选项),要么使用Hibernate的底层Session
。
为此,您可以将EntityManager的委托转换为Hibernate Session。
Session session = (Session) em.getDelegate();
当然,这仅在将Hibernate用作Java Persistence提供程序时才有效,因为委托是会话API。
然后,分离对象:
session.evict(object);
更新:
根据在使用EntityManager.getDelegate()时要小心,对于GlassFish,应该实际使用(并且也可能在您的情况下使用):
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
但是,这会 不会 在JBoss中的工作,建议使用前面提到的代码。
org.hibernate.Session session = (Session) em.getDelegate();
虽然我知道使用getDelegate()
会使JPA代码不可移植,但我必须承认我不希望此方法调用的结果特定于实现。
UPDATE2:
要回答问题的更新部分,我不确定您是否急于加载类别。这不是执行此操作的最佳方法,但是如果您categories.get(0)
在驱逐之前致电,会发生什么?另外,我可能会缺少该部分,但是,您在哪里取消类别的键?
我与以下实体类有一个双向的一对多关系: 当然,所有必需的级联选项都是在客户端设置的。但如果在引用现有产品订单时首次持久化新创建的客户端(如本场景所示),则它将不起作用: 已创建并持久化产品订单“%1”。工作正常。 已创建客户端“%2”,并将产品订单“%1”添加到其产品订单列表中。然后它被持久化。不起作用。 我尝试了几个apporach,但没有一个显示出预期的结果。请参阅下面的结果。我在这里阅读了所
我有以下100万个实体的关系,指导学生。mentor有复合主键,我在student中使用它作为外键 然后,我将上面的内容保持为下面的内容,但在student表为空的地方,只有mentor被保持。 我如何坚持与学生的导师?
我正在尝试使用JPA合并具有@OneTo多人关系的实体,但它会抛出设置为持久化错误的分离实体。我没有持久化实体,我正在合并它。我只是在使用连接获取将Alumno实体加载到他的Matcourse a实体时遇到问题。以下是代码: 注:Alumno指学生,Asignatura指学科,Matricula指学生学科,是一名学生与其学科之间的关系。这种关系有很多种,都有额外的桌子。 更详细的信息:使用下一个查
问题内容: 我想和Hibernate保持我的小动物园: 当我尝试保持动物园时,hibernate状态抱怨: 我知道-的属性,但这意味着,只有猫狗可以住在我的动物园里。 有没有办法用Hibernate来持久化具有多个实现的接口集合? 问题答案: 接口上不支持JPA批注。从 Java Persistence with Hibernate (p.210): 请注意,JPA规范在接口上不支持任何映射注释!
直截了当地说:我有一个包含项目的小组。我想用外键处理这个关联,这就是为什么它有一个mappedby标记。我的问题是,如果我查询组,我会进入一个有限循环,其中组列出了包含该组的项目,该组列出了再次包含该组的项目。。。。。等等我的实体(最小版本): 有人能帮助如何避免这个循环吗?如果我在DBGroup中将fetchtype更改为懒,我就会得到一个LazyLaunalizationEXcep。 感谢您的
我有一个实体用户: 和实体课程 我需要制作 user1 课程的副本(深度副本),并将此副本添加到另一个用户 2。最后,我需要用户1有课程,用户2有课程的副本。