不管一个对象是不是有人工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直接标注函数,也是不会更新到数据库中的,这个和视频中的结果不一样,不知道为什么