Hibernate瞬时态_持久太_游离态

前言

总结一个多年以前自己犯的错误,就是Hibernate持久化状态下,查出来的数据,只要set过修改过数据之后, 不用save也会自动更新.

@Service
@Slf4j
public class DemoEntityServiceImpl implements DemoEntityService {
   

    @Resource
    DemoEntityRepository demoEntityRepository ;

    @Override
    public 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());
  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值