hibernate做数据同步时的问题
2017-11-29 19:50
162 查看
当我们有做数据同步需求时,如果表中除了主键不能重复,还有其他字段比如名称不能重复,那么在做同步时可能会出现以下情况:
A平台上数据已经删除,此时B平台的数据库还未同步,这时A平台新增了一个名称与原来一样的资源。这时B平台开始做数据同步,不巧的是,删除操作在添加操作之后,那么会出现无法保存名字相同的数据。那么该怎么办?
解决方法就是先做删除,后做保存。但由于hibernate机制问题,在批量操作后,使用一个commit,会先发送save语句,导致报错。那么该怎么办?
解决方法就是先做删除,并使用session.flush。后做保存,最后再commit。
/flush的作用是发送语句到mysql,让mysql中状态与session一致,但不清缓存,在mysql的一个会话中, 数据是一条一条处理的,一旦前一条删除,后一条即使与前一条主键相同,那也是能插入的。不用flush,那么最终是由commit方法中的flush来发送语句,但是会发现delete没有先执行,而是save先执行。
在实验过程中还发现一个问题,就是如果先删除一个对象,后面要保存的对象的主键值和前面被删对象一致,那么在执行save时就会向mysql发送delete语句,而不需要flush。
A平台上数据已经删除,此时B平台的数据库还未同步,这时A平台新增了一个名称与原来一样的资源。这时B平台开始做数据同步,不巧的是,删除操作在添加操作之后,那么会出现无法保存名字相同的数据。那么该怎么办?
解决方法就是先做删除,后做保存。但由于hibernate机制问题,在批量操作后,使用一个commit,会先发送save语句,导致报错。那么该怎么办?
解决方法就是先做删除,并使用session.flush。后做保存,最后再commit。
/flush的作用是发送语句到mysql,让mysql中状态与session一致,但不清缓存,在mysql的一个会话中, 数据是一条一条处理的,一旦前一条删除,后一条即使与前一条主键相同,那也是能插入的。不用flush,那么最终是由commit方法中的flush来发送语句,但是会发现delete没有先执行,而是save先执行。
在实验过程中还发现一个问题,就是如果先删除一个对象,后面要保存的对象的主键值和前面被删对象一致,那么在执行save时就会向mysql发送delete语句,而不需要flush。
相关文章推荐
- Hibernate 数据不同同步,重启Tomcat后才同步的问题解决
- Hibernate审计日志时业务数据无法同步问题解决
- Hibernate 数据不同同步,重启Tomcat后才同步的问题解决
- hibernate保存数据和调用存储过程数据事务不同步的问题
- listview分页加载刷新——--填充数据,适配器更新与UI同步更新问题
- 如何处理集群、分布架构的数据同步问题
- hibernate刷新数据时的缓存问题
- Hibernate的order by遇到null致数据丢失的问题
- mysql hibernate java deecimal数据映射问题
- SQLServer 2012之AlwaysOn —— 指定数据同步链路,消除网络抖动导致的提交延迟问题
- EF Core下利用Mysql进行数据存储在并发访问下的数据同步问题
- firefox同步数据时无响应问题
- 解决spring mvc +hibernate整合时使用jackson返回json数据无限循环问题的官方解决方案
- 【hibernate】问题:hibernate无法持久化数据
- mysql及hibernate数据查询遇见的几个问题
- android模拟器添加帐号 数据同步问题
- 如何避免mysql 主从同步中由于数据记录找不到和主键重复错误导致的同步异常问题
- hibernate 一对一、多对一 双向关联的问题——只能在多的一方添加、修改数据,不能在多的一方修改添加
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 能支撑10万以上客户端的数据同步下载问题
- Logstash使用jdbc_input同步Mysql数据时遇到的空时间SQLException问题