【问题标题】:Simpler way to delete JPA mapped tables records删除 JPA 映射表记录的更简单方法
【发布时间】:2021-11-20 07:57:53
【问题描述】:

有没有更简单的方法来删除由@OneToMany 和@ManyToOne JPA 映射映射的表的记录。目前我使用 PostgreSQL 作为我的数据库。我要删除 0 到 999 的 1000 条记录,其余的要保留。由于删除引用(外键)的每条记录将非常忙碌。只是想要一种更简单的方法来做到这一点。

【问题讨论】:

  • 删除id=0到id=999的记录
  • 如果它们是虚拟记录并且您要删除数据库中的所有内容,您可以通过将 Persistence.xml 文件中的 javax.persistence.schema-generation.database.action 更改为 drop-and-create 来重新创建数据库
  • 不,我已经合并了其他数据库中的其他数据,所以如果我删除数据库,那么一切都会消失。

标签: sql postgresql hibernate rest jpa


【解决方案1】:

您始终可以在 JPA 中执行DELETE 查询:

int rowsDeleted = entityManager
    .createQuery("DELETE FROM MyEntity WHERE id >= 0 AND id <=999")
    .executeUpdate();

如果有外键,你需要做一些额外的工作:

int childRowsDeleted = entityManager
    .createQuery("DELETE FROM MyChildEntity WHERE parent.id >= 0 AND parent.id <=999")
    .executeUpdate();
int rowsDeleted = entityManager
    .createQuery("DELETE FROM MyEntity WHERE id >= 0 AND id <=999")
    .executeUpdate();

如果外键比较多,或许可以考虑JPA cascade remove:

@OneToOne(cascade={CascadeType.REMOVE})

然后entityManager.remove() 每个实体,但这会对性能产生影响,因为您最终会得到许多 DELETE 查询,每个查询都会删除一行。

【讨论】:

    【解决方案2】:

    通过引入@DeleteMapping 得到了这个,它甚至不用使用就可以工作 "@OnDelete(action = OnDeleteAction.CASCADE)" 子类中映射变量声明上方的这个注解 [https://www.callicoder.com/hibernate-spring-boot-jpa-one-to-many-mapping-example/#get-paginated-posts-get-postspage0size2sortcreatedatdesc],我们可以按照这个链接获取一个完整的概览。

     @DeleteMapping("/posts/{postId}")
        public ResponseEntity<?> deletePost(@PathVariable Long postId) {
            return postRepository.findById(postId).map(post -> {
                postRepository.delete(post);
                return ResponseEntity.ok().build();
            }).orElseThrow(() -> new ResourceNotFoundException("PostId " + postId + " not found"));
        }
    

    【讨论】:

    • 现在我可以将存储库部分保持在循环中。
    猜你喜欢
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    相关资源
    最近更新 更多