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不存在,則添加),