java - Hibernate:一次删除所有具有关联的实体

标签 java hibernate orm

我想实现 deleteAll 方法,该方法将删除所有 User 实体及其关联,同时我想防止 java.lang.OutOfMemoryError 在内存堆中获取用户集合时出现异常。

我当前的实现类似于下面的代码片段:

public void deleteAll() {
    final int PAGE_SIZE = 15;
    final int PAGE_NUMBER = 0;
    final String SORTING_PROPERTY_NAME = "id";
    List<User> result;

    Session session = sessionFactory.getCurrentSession();
    Criteria criteria = session.createCriteria(User.class);
    criteria.addOrder(Order.asc(SORTING_PROPERTY_NAME));
    criteria.setFirstResult(PAGE_NUMBER);
    criteria.setMaxResults(PAGE_SIZE);

    do {
        result = criteria.list();
        result.forEach(session::delete);
    } while (result.size() == PAGE_SIZE);
}

如您所见,我正在使用分页方法,因此我获取了一批数据然后将其删除,依此类推。这在现实中是如何通过 Hibernate 实现的?感谢您的帮助。

最佳答案

试试这个:

sessionFactory.getCurrentSession().createQuery("delete from User").executeUpdate();

您无需获取所有记录(或任何部分)即可删除它们。 也看here .也许它会有用。

不幸的是,这种方法不会触发级联移除。也许你可以批准另一种方法。例如,创建附加列“is_deleted”并在删除时将值设置为 true。在此之后,您可以在晚上安排工作。这项工作实际上将通过您的方法删除这些用户的一部分。但是您必须向 get\fetch 方法添加一个条件,以仅考虑 is_deleted=false 用户。

关于java - Hibernate:一次删除所有具有关联的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38686841/

相关文章:

java - Sonarqube 没有同时选择 Kotlin 和 Java Coverage gradle 项目

java - jQuery,用引号发布的评论不起作用,否则效果很好

java - hibernate 、OneToMany、AnnotationException

java - save() 性能 - saveAndFlush() 会更好吗?

python - SQLAlchemy:排除从查询的子查询中获取的行

mysql - 将 MySQL DB 表/数据从本地迁移到生产服务器 Laravel

java - 如果两个接口(interface)包含相同的默认方法会怎样?

java - 金融信息交换网络平台 (QuickFix/J)

java - Spring 数据 jpa @query 和可分页

java - spring mvc hibernate中刷新页面时如何添加更多购物车而不增加数量