当前位置: 首页 > 面试题库 >

复制实体集合并坚持使用Hibernate / JPA

翁翰墨
2023-03-14
问题内容

我想在数据库中复制实体集合。我使用以下方法检索该集合:

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有课程的副本。