V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jerrry
V2EX  ›  Java

spring data jpa 软删除最佳实践?

  •  
  •   jerrry · 2020-07-30 07:12:11 +08:00 via Android · 4283 次点击
    这是一个创建于 1579 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前是通过用 Query 注解写一个基础的 BaseSoftDeleteRepository,然后给其他 repository 继承,但是这样基于命名规则的查询 (比如 findByUsername) 还是没有过滤已经软删除的数据,大家是怎么解决的?

    8 条回复    2020-07-30 12:49:44 +08:00
    ourslay
        1
    ourslay  
       2020-07-30 07:48:14 +08:00 via iPhone
    entity 实体上加上 @Where 注解
    jerrry
        2
    jerrry  
    OP
       2020-07-30 08:17:50 +08:00 via Android
    @ourslay 这个是 hibernate 的注解吧,而且加了之后想查所有的就麻烦了。
    ourslay
        3
    ourslay  
       2020-07-30 09:17:14 +08:00
    是的,如果 @where 满足不了你,可以试试 @Filter

    还有 1 种方案是写 native 方式进行查询全部
    @Query(value="SELECT * FROM EntityA", nativeQuery=true)
    public ignoreWhereMethod(){}
    VeryZero
        4
    VeryZero  
       2020-07-30 09:34:07 +08:00
    默认使用 @Where
    查所有数据就使用单独的 @Query
    虽然不够优雅,但是这是目前我找到的最佳实践了.
    passerbytiny
        5
    passerbytiny  
       2020-07-30 09:54:38 +08:00 via Android
    Hibernate (而非 JPA )提供的软删除是隐藏式软删除,完全由基础设施(业务不参与,完全由 Repository 的技术实现或 ORM 自行处理),总感觉没什么用(因为业务上不关心,所以你留下的历史数据业务上也不会用,只能数据库自己 Happy ),而且容易出坑。

    何不试试跳出 CRUD 的框架让业务层直接去处理软删除(这时候你能部分理解到为何账户注销功能那么难做)。然后不能所有的实体都一刀切的软删除,大部分实体都是要硬删除的(可选配转到历史实体,或者仅在数据库搞触发器)
    jerrry
        6
    jerrry  
    OP
       2020-07-30 12:41:46 +08:00 via Android
    @ourslay 谢谢
    jerrry
        7
    jerrry  
    OP
       2020-07-30 12:46:25 +08:00 via Android
    @VeryZero 我是和 QueryDsl 结合起来用的,@Where 应该不会生效,我试一下...
    jerrry
        8
    jerrry  
    OP
       2020-07-30 12:49:44 +08:00 via Android
    @passerbytiny 我们设计的大部分实体都是软删除的。。。我其实更倾向于用 binlog 之类的方式把删除的实体存到另外一个库。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3020 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:44 · PVG 22:44 · LAX 06:44 · JFK 09:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.