最近项目需要进行数据同步,第三方修改数据,需要同步更新、添加到我方数据库。
我方系统使用的是注解配置的hibernate,主键id是自动生成的uuid。
问题 : 第三方数据的id不可以set进一个新new出来的对象 , 再update , 这样做会报错 。(为什么报错?)
解决 :
1、修改id生成策略 对系统的影响较大,(不合适)
2、删除之后再新增(不合适:如果id 有关联数据,该方法完全无法使用)
3、就是使用sql语句
4、获取到我方系统对象数据A,将第三方数据B除了id之外的所有值,赋值给A对应的字段,再更新;
5、 通过hibernate 的merge()方法;
原因:
hibernate中对象有四种状态:
- 瞬时状态:一个新建的对象是处于瞬时状态的,未被实例化,即不和数据库中的任意表有关联,不存在与session中、不存在于数据库中。
- 持久化状态(托管状态):这个对象是包含数据库同一性的实体,存在与session中、存在与数据库中。
- 游离状态(脱管状态):对象状态不与数据库状态同步,但仍包含持久化数据,不存在与session中。
- 移除状态(删除状态):一个对象如果已经被计划在一个工作单元结束时删除,它就是处于移除状态,。
修改update 是一个 游离到持久的一个过程,而新new 的对象是瞬时状态,所以会报错!
hibernate 的 merge
extends HibernateDaoSupport