有没有办法将分离的对象传递给JPA持久化?(传递给持久化的分离实体)

Jaa*_*nus 10 java hibernate jpa entitymanager

我有2个实体:AccountAccountRole.

public class Account {
   private AccountRole accountRole;

   @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
   public AccountRole getAccountRole() {
      return accountRole;
   }
Run Code Online (Sandbox Code Playgroud)

.

public class AccountRole {
    private Collection<Account> accounts = new ArrayList<Account>();

    @OneToMany(mappedBy = "accountRole", fetch = FetchType.EAGER)
    public Collection<Account> getAccounts() {
         return accounts;
    }
Run Code Online (Sandbox Code Playgroud)

当我从数据库中获取accountRole并试图坚持我的问​​题时出现问题Account.此时我刚创建了我的帐户,角色已经存在于db中.

AccountRole role = accountService.getRoleFromDatabase(AccountRoles.ROLE_USER);
account.setAccountRole(role);

//setting both ways, as suggested
public void setAccountRole(AccountRole accountRole) {
    accountRole.addAccount(this);
    this.accountRole = accountRole;
}

entityManager.persist(account); // finally in my DAO
Run Code Online (Sandbox Code Playgroud)

我读到这个:JPA/Hibernate:传递给persist的分离实体 我理解的是,我必须从两个方向设置实体值,以便我在我的setter中做什么.

仍然有错误.

 org.hibernate.PersistentObjectException: detached entity passed to persist: foo.bar.pojo.AccountRole
Run Code Online (Sandbox Code Playgroud)

Jaa*_*nus 16

只需更换

entityManager.persist(account);
Run Code Online (Sandbox Code Playgroud)

有:

entityManager.merge(account);
Run Code Online (Sandbox Code Playgroud)

并允许合并级联:

@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.EAGER)
public AccountRole getAccountRole() {
    return accountRole;
}
Run Code Online (Sandbox Code Playgroud)

因为合并这样做:

如果您的实体是新实体,则它与persist()相同.但是如果您的实体已经存在,它将更新它.