spring jpa关于detached状态的对象的更新与保存

不管一个对象是不是有人工ID值,只要在保存前,这个对象有ID值

entityManger.merge(entity);

就会自动更新,如果数据库没有这个记录,也会自动保存



--------------------------------------------------------------------------------------------------

merge时,如果还要保存到数据库,就一定要进行事务处理,

但是,事务处理不能是

  entityManager.getTransaction().begin();
entityManager.merge(cat);
//entityManager.flush();
  entityManager.getTransaction().commit();

这样还是会报错的,正确的做法是这样的,需要加上@Transactional,并且,是最直接的函数上,下面的代码是写在impl里面的,如果用在service里加上@Transactional,这个函数里面不加,也是没有用的,另外,加上@Transactional后,不用再做flush了,数据库也会更新

@Transactional
public void updateCat(Cat cat) {
// TODO Auto-generated method stub
//if(cat.getId() != null)
// entityManager.getTransaction().begin();
entityManager.merge(cat);
//entityManager.flush();
// entityManager.getTransaction().commit();
// entityManager.flush();
}

-----------------------------------------------------------------------------

还有一个问题,从数据库刚取出来的对象,改变属性,不做merge,用@Transactional直接标注函数,也是不会更新到数据库中的,这个和视频中的结果不一样,不知道为什么

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值