本文主要是介绍Hibernate瞬时态_持久太_游离态,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
总结一个多年以前自己犯的错误,就是Hibernate持久化状态下,查出来的数据,只要set过修改过数据之后, 不用save也会自动更新.
@Service
@Slf4j
public class DemoEntityServiceImpl implements DemoEntityService {@ResourceDemoEntityRepository demoEntityRepository ;@Overridepublic void testNoHaveSaveButSaveSuccess() {DemoEntity demoEntity =demoEntityRepository.findOne(1L);
demoEntity.setBalance(12L);
demoEntity.setName("张宇晋"); //观察到下面没有save方法,但是这里实实在在显示到数据库中去了DemoEntity copy = demoEntity ;
copy.setName("copyEntity"); //最终数据id为1的数据库中 name为 copyEntity ,因为是浅复制DemoEntity demoEntityT = new DemoEntity();
demoEntityT.setName("z1");
demoEntityRepository.save(demoEntityT);demoEntityT.setBalance(12L); //会对上面的进行更新}
}
解释:
1.瞬态:
一个实体通过new操作符创建后,没有和Hibernate的Session建立关系,也没有手动赋值过该实体的持久化
标识(持久化标识可以认为是映射表的主键)。
此时该实体中任何属性的更新都不会反映到数据库表中。
2.持久化:
当一个实体和Hibernate的Session创建了关系,并获取了持久化标识,而且在Hibernate的Session生命周期内
存在。
此时针对该实体任何属性的更改都会直接影响到数据库表中一条记录对应字段的更新,即与数据库表同步。
3.脱管:
当一个实体和Hibernate的Session创建了关系,并获取了持久化标识,而此时Hibernate的Session生命周期结
束,实体的持久化标识没有被改动过。
针对该实体任何属性的修改都不会及时反映到数据库表中。
解决方案
如果我们只是想使用这个查出来的实体,并且在某种情况下,如果需要里面的值,并且要对它进行暂时的修改,却不是修改之后要保存到数据库中
情景:淘宝的appkey和appSecret保存了,默认给提供一些渠道数据,当定时器在修改某个商品的渠道的时候,淘宝信息是我们需要的,但是它提供的渠道却不是我们需要的,所以时候是要set渠道一下一下。
1、重新new一个出来
BeanUtils.copyProperties(, );或者下面的public static TaobaoUserInfo getNewTaobaoUserInfo(TaobaoUserInfo source){TaobaoUserInfo target = new TaobaoUserInfo();target.setId(source.getId());target.setCouponAdzoneId(source.getCouponAdzoneId());target.setUserId(source.getUserId())
这篇关于Hibernate瞬时态_持久太_游离态的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!