jpa update 和 delete 之前都会 select 一次,发现 querydsl 挺直接的没这个问题,大家分析一下有必要吗? 如果没有这个对象就会抛出对应的 exception
1
Kontinue 2022-09-16 10:20:00 +08:00
dirty check 吧,好像可关掉的
|
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 |
3
timethinker 2022-09-16 13:04:08 +08:00
这是因为框架机制的原因导致的,Hibernate 使用了一种被称之为工作单元模式( Unit of Work ),与数据库的事务进行对应,这样就会对实体的状态进行追踪,在这种机制下就会产生一个问题:如果没有这条数据,会发生什么?程序无法推测你的意图,有的场景下当数据不存在会导致一致性问题,也有的场景下存在“不关心有没有这条数据,如果有的话就删掉”这种逻辑。后者更偏向于面向数据库编程的过程式逻辑。
这种工作机制不适合用于进行批量处理的场景,它更适合用于处理一些小范围的 OLTP 业务,带来的好处也是明显的,一级缓存避免了在接下来的事务范围中对同一个实体进行重复查询,也不需要显式的调用底层的数据操作,你只需要简单的查询对象,修改对象,在工作单元结束时(提交事务),它会根据对象现在的状态自动调用底层的数据操作,执行对应的 SQL 语句。 所以很多人用 JPA 会觉得很别扭,本质上是因为思考的方式跟它的工作机制存在差异,理解工具的处理机制是很重要的,因为这样才能让你更好的使用它。如果你写代码的逻辑思维处于那种过程式的增删改查,那么 MyBatis 或许更简单直观。 我个人认为,Hibernate 与 MyBatis 之间,不存在哪一个工具更好的这种说法,完全取决于你编写代码的模式,选一种你认为适合当下的工具就行,使用工具的目的是为了提升效率,仅此而已。 |
4
kqq19930511 OP @timethinker 是的,不纠结了
|