hibernate主键非native 时flush的影响

hibernate的主键生成策略常用的有三种,uuid,native,和assigned三种,三种不同的配置方式对数据库发送sql语句的时机也有略微的不同,下面进行以下总结:

数据库我们采用的是mysql,隔离级别为读已提交

我们关注的主要是session中的existsInDatabase属性

1:uuid

save: existsInDatabase=false

flush: existsInDatabase=true

2:native

save: existsInDatabase=true

3:assigned

save: existsInDatabase=false

flush: existsInDatabase=true

结论:uuid和assigned由于都不是数据库生成的主键,所以会在执行flush的时候执行刷出镜像数据,执行sql语句

而native会在执行save的时候执行sql语句原因是生成主键的时候需要数据库的支持,那么会产生的现象就是,策略

不是native时我们执行save后再evict,将会出现异常在session的insertions集合中取出对象进行insert操作后
需要更新entityEntries属性中的existsInDatabase为true,而我们采用evict已经将对象从session的entityEntries

中逐出了,所以找不到相关数据,无法更新,抛出异常。并且会发现,flush的时候sql语句的执行顺序是insert

update,delete 并不是按照我们代码的顺序

所以,当主键生成策略为非native时,为了避免不必要的麻烦记得及时的flush

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值