1.persist和merge的区别:
Persist:添加
Merge : 分两种情况,当对象存在id,则修改;当对象不存在id则添加。
看个例子:
1 1 public class Account { 2 2 private AccountRole accountRole; 3 3 @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER) 4 4 public AccountRole getAccountRole() { 5 5 return accountRole; 6 6 } 7 7 8 8 //添加account的代码段 9 9 AccountRole role = accountService.getRoleFromDatabase(AccountRoles.ROLE_USER); 10 10 account.setAccountRole(role); 11 11 entityManager.persist(account);//entityManager.merge(account)
问题说明: role是从数据库中查询出来的,在这种情况下 用persist方法保存account对象,persist同时会将role也保存,这时候因为role这条记录在数据库中已经存在,所以
这时候调用 persist(account);会报异常。
解决方法:
1. 可以取消掉persist方法调用时保存关联对象,即取消掉cascade = CascadeType.PERSIST
2.可以使用merge方法替代persist。
所以从这可以看出,persist是直接保存,merge是根据id是否存在来判断是保存还是修改(id存在,则修改; id不存在,则添加),