通过Java ORM批量删除/清除记录

5 java jpa batch-file purge

对 - 我想从数据库中删除(例如)1,000,000条记录.这需要很长时间 - >事务超时并失败.所以 - 我分批删除它们说每笔交易25000条记录.使用MySQL上的limit子句或Oracle上的ROWNUM.这很棒.

我想以独立于数据库的方式这样做.并且来自使用JPA/Hibernate的现有Java代码库.

运气不好.JPA Query.setMaxResults和setFirstResult对写'查询'没有影响(例如删除).在内存中选择许多实体来单独删除它们是非常缓慢和愚蠢的我会说.

所以我使用本机查询并管理应用程序代码中的'limit'子句.将这个子句封装在orm.xml中会很好,但是......"Hibernate Annotations 3.2不支持使用本机查询进行批量更新/删除." - http://opensource.atlassian.com/projects/hibernate/browse/ANN-469.

我想这是一个常见的问题.有人有更好的数据库独立解决方案吗?

Jer*_*nch 5

我讨厌给出一个非建设性的答案,但ORM并不是真正意义上对数据库进行批量操作.所以看起来你的本机查询可能是这些操作的最佳选择.

您还应该确保更新ORM以反映数据库的新状态,否则您可能会发生一些奇怪的事情.

ORM是将对象映射到数据库的绝佳工具,但它们通常不是通用的数据库接口.


Aar*_*lla 0

查询限制是数据库特定的功能,并且没有 SQL 标准(我同意应该有)。

适用于大多数数据库的一种解决方案是使用视图将多个表分组为一个。每个表都包含数据的子集(比如某一天)。这允许您一次删除整个子集。也就是说,许多数据库在此类视图上运行 UPDATE 和 INSERT 时都会出现问题。

通常可以通过为 INSERT/UPDATE 创建视图或别名(指向单个表;“当前”表)和用于搜索的分组视图来解决此问题。

有些数据库还提供分区,这基本上是相同的,只是您可以定义一个列来指定一行应该位于哪个基础表中(在 INSERT 上)。当您需要删除子集时,可以删除/截断基础表之一。