当前位置: 首页 > 知识库问答 >
问题:

清除 JPA 或Hibernate实体管理器或在删除操作之前合并实体

叶冥夜
2023-03-14

我有一个通用的JPA存储库实现,处理以下多种类型的实体:

@Component
@Transactional(transactionManager = "ubldbTransactionManager")
public class CatalogueRepositoryImpl {
...

    @PersistenceContext(unitName = eu.nimble.utility.Configuration.UBL_PERSISTENCE_UNIT_NAME)
    private EntityManager em;

    public <T> void deleteEntity(T entity) {
        if(!em.contains(entity)) {
            entity = em.merge(entity);
        }
        em.remove(entity);
    }

    public <T> List<T> getEntities(String queryStr) {
        Query query = em.createQuery(queryStr);
        List<T> result = query.getResultList();
        return result;
    }
...
}

在某个时候,我意识到一些实体还没有被删除。然后,我发现一些托管实体导致删除的取消,如下所述:https://stackoverflow.com/a/16901857/502059

由于该方法是通用的,因此它包含各种类型的实体。作为一种解决方法,我想摆脱导致取消删除的实体,并在 deleteEntity 方法的开头添加了 em.flush() 和 em.clear()。虽然这有效,但我觉得这是一个肮脏的解决方法。

所以,我想问一下这种情况的最佳做法。例如,在deleteEntity中创建一个新的EntityManager是一种替代方法吗?我不想这样做,因为我希望Spring处理<code>EntityManagers</code>和<code>transactions</code>的范围管理。

关于Spring管理的EntityManager的最后一点:我还想知道Spring管理的示例中的em是否是应用程序范围的?如果是这样的话,它不会保留所有检索到的实体并不断扩展吗?

共有1个答案

司寇飞航
2023-03-14

如果您使用的是Hibernate,则无需在删除实体之前进行合并。这只是JPA的要求,但Hibernate在这方面更为宽松。

你也可以这样做:

entity = em.getReference(entity.getClass(), entity.getId());
em.remove(entity);

如果这不起作用,可能是因为您没有将REMOVE操作级联到子关联。

您可以使T参数扩展一个Identifiable接口,该接口定义了getId方法,并让您的实体实现此接口,使您的方法更通用。

 类似资料:
  • 问题内容: 我有两个分别以双向一对多关系存在的实体类 A 和 B。 A.java: B.java 在一个简单的控制台应用程序中,我从数据库中获取了特定的 A 行,并尝试删除其详细信息 B 行(随机),但是 JPA / Hibernate* 不仅删除了该行-甚至没有向该行发出任何 DELETE 语句。数据库。删除 B 行的唯一方法是从 A.java 的集合( LinkedHashSet )中删除相应

  • 主要内容:JPA实体删除示例要从数据库中删除记录,可以使用接口提供方法。方法使用主键来删除特定的记录。 JPA实体删除示例 在这里,我们将演示如何根据主键删除指定学生的信息。 完整的项目代码如下所示 - 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,它包含属性:,和。 文件:StudentEntity.java 的代码如下 - 第2步: 将实体类和其他数据库配置映射到文件中。 文件:persistence.

  • 我有一些关于“级联”的问题,在我的项目中,我有类别类,每个类可以是父类或子类。但我在同一个类中定义了哪一个是父母还是孩子。父母和孩子之间存在一对多的关系。这是我的实体类 我的问题是;当我删除子类别时,它的成功并没有问题。如果父类别有子类别,则无法删除父类别。 错误消息; Servlet.service()的servlet[调度Servlet]在上下文中与路径[]抛出异常[请求处理失败;嵌套异常or

  • 问题内容: 我有以下通常正常工作的代码: 对于我的许多实体类来说,这都是可行的。但是对于其中的两个它什么也不做,它不会引发任何异常,也不会删除该对象。来自hibernate的日志显示,hibernate执行了许多选择查询,但它甚至没有尝试执行删除。 我已经在这里和这里尝试了在其他类似问题中发现的建议,但是没有用(嗯,后者建议我不能使用,但是我只是在和之间加上了语句)。 我似乎找不到这两个类比其他类

  • 我有以下通常运行良好的代码: 对于我的许多实体类,这很有效。但是,对于其中两个,它什么都不做,它不会引发任何异常,也不会删除对象。来自Hibernate的日志显示Hibernate执行了许多选择查询,但它甚至不会尝试执行删除。 我已经尝试了在这里和这里的其他类似问题中找到的建议,但无济于事(好吧,后者建议我不能使用,但我只是将语句括在和之间)。 我似乎找不到这两个班比其他班多(或少)什么。他们使用

  • 我有2个实体类(表A的实体和表B的实体)。表 A 链接到表 B。因此,实体类具有 B 实体的对象列表,并声明如下图所示。 @OneToMany(mappedBy=“AEntity”,cascade=CascadeType.REMOVE,fetch=FetchType.LAZY)private List items=new ArrayList(); 如果我使用“entityManager.remov