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

jpa update 和 delete 之前都会 select 一次

  •  
  •   kqq19930511 · 2022-09-16 10:15:22 +08:00 · 1728 次点击
    这是一个创建于 800 天前的主题,其中的信息可能已经有所发展或是发生改变。

    jpa update 和 delete 之前都会 select 一次,发现 querydsl 挺直接的没这个问题,大家分析一下有必要吗? 如果没有这个对象就会抛出对应的 exception

    4 条回复    2022-09-16 13:09:35 +08:00
    Kontinue
        1
    Kontinue  
       2022-09-16 10:20:00 +08:00
    dirty check 吧,好像可关掉的
    qinxi
        2
    qinxi  
       2022-09-16 11:37:46 +08:00
    select 的出处: org.springframework.data.jpa.repository.support.SimpleJpaRepository#deleteById

    为什么要 select: https://stackoverflow.com/questions/13210638/hibernate-delete-query/13240979#13240979
    timethinker
        3
    timethinker  
       2022-09-16 13:04:08 +08:00
    这是因为框架机制的原因导致的,Hibernate 使用了一种被称之为工作单元模式( Unit of Work ),与数据库的事务进行对应,这样就会对实体的状态进行追踪,在这种机制下就会产生一个问题:如果没有这条数据,会发生什么?程序无法推测你的意图,有的场景下当数据不存在会导致一致性问题,也有的场景下存在“不关心有没有这条数据,如果有的话就删掉”这种逻辑。后者更偏向于面向数据库编程的过程式逻辑。

    这种工作机制不适合用于进行批量处理的场景,它更适合用于处理一些小范围的 OLTP 业务,带来的好处也是明显的,一级缓存避免了在接下来的事务范围中对同一个实体进行重复查询,也不需要显式的调用底层的数据操作,你只需要简单的查询对象,修改对象,在工作单元结束时(提交事务),它会根据对象现在的状态自动调用底层的数据操作,执行对应的 SQL 语句。

    所以很多人用 JPA 会觉得很别扭,本质上是因为思考的方式跟它的工作机制存在差异,理解工具的处理机制是很重要的,因为这样才能让你更好的使用它。如果你写代码的逻辑思维处于那种过程式的增删改查,那么 MyBatis 或许更简单直观。

    我个人认为,Hibernate 与 MyBatis 之间,不存在哪一个工具更好的这种说法,完全取决于你编写代码的模式,选一种你认为适合当下的工具就行,使用工具的目的是为了提升效率,仅此而已。
    kqq19930511
        4
    kqq19930511  
    OP
       2022-09-16 13:09:35 +08:00
    @timethinker 是的,不纠结了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5794 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 01:50 · PVG 09:50 · LAX 17:50 · JFK 20:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.