entityManager的常用方法---update操作(二)merge的应用
entityManager的常⽤⽅法---update操作
(⼆)merge的应⽤
分2种情况
情况1:当实体正在被容器管理时,你可以调⽤实体的set⽅法对数据进⾏修改,在容器决定flush时(这个由⾃⾏判断),更新的数据才会同步到数据库,⽽不是在调⽤了set⽅法对数据进⾏修改后马上同步到数据库。如果你希望修改后的数据马上同步到数据库,你可以调⽤ EntityManager.flush()⽅法。
挂职副县长工作总结public void updatePerson() {
try {
Person person = em.find(Person.class, 1);
person.setName("lihuoming"); //⽅法执⾏完后即可更新数据
} catch (Exception e) {
高考录取方式
e.printStackTrace();
}
}
情况2:在实体Bean已经脱离了EntityManager的管理时,你调⽤实体的set⽅法对数据进⾏修改是⽆法同步更改到数据库的。你必须调⽤()⽅法。调⽤之后,在容器决定flush时(这个由container⾃⾏判断),更新的数据才会同步到数据库。如果你希望修改后的数据马上同步到数据库,你可以调⽤EntityManager.flush()⽅法。
public boolean updatePerson(Person person) {
try {
<(person);
} catch (Exception e) {
e.printStackTrace();
return false;
}
清代皇帝顺序
return true;
农业银行怎么贷款
}
下⾯的代码会调⽤上⾯的⽅法。因为下⾯的第⼆⾏代码把实体Bean 返回到了客户端,这时的实体Bean已经脱离了容器的管理,在客户端对实体Bean进⾏修改,最后把他返回给EJB 容器进⾏更新操作:
PersonDAO persondao = (PersonDAO) ctx.lookup("PersonDAOBean/remote");
Person person = PersonByID(1); //此时的person 已经脱离容器的管理
person.setName("张⼩艳");
persondao.updatePerson(person);
执⾏em.merge(person)⽅法时,容器的⼯作规则:
1>    如果此时容器中已经存在⼀个受容器管理的具有相同ID的person实例,容器将会把参数person的
内容拷贝进这个受管理的实例,merge()⽅法返回受管理的实例,但参数person仍然是分离的不受管理的。容器在决定Flush时把实例同步到数据库中。
2>容器中不存在具有相同ID的person实例。容器根据传进的person参数Copy出⼀个受容器管理的person实例,同时 merge()⽅法会返回出这个受管理的实例,但参数person仍然是分离的不受管理的。容器在决定Flush时把实例同步到数据库中。
高速 超速如果传递进merge ()⽅法的参数不是实体Bean,会引发⼀个IllegalArgumentException。
merge的作⽤是:新new⼀个对象,如果该对象设置了ID,则这个对象就当作游离态处理:
当ID在数据库中不能到时,⽤update的话肯定会报异常,然⽽⽤merge的话,就会insert。
当ID在数据库中能到的时候,update与merge的执⾏效果都是更新数据,发出update语句;
渝简称如果没有设置ID的话,则这个对象就当作瞬态处理:
⽤update的话,由于没有ID,所以会报异常,merge此时则会保存数据,根据ID⽣产策略⽣成⼀条数据;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。