11

我有 2 个实体:AccountAccountRole

public class Account {
   private AccountRole accountRole;

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

.

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

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

当我从数据库中获取 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

我读到了这个:JPA/Hibernate: detached entity pass to persist 而我的理解是,我必须从两个方向设置实体值,这样我在我的设置器中所做的事情。

仍然出现错误。

 org.hibernate.PersistentObjectException: detached entity passed to persist: foo.bar.pojo.AccountRole
4

3 回答 3

18

只需更换

entityManager.persist(account);

和:

entityManager.merge(account);

并允许合并级联:

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

因为合并是这样做的:

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

于 2012-12-12T10:16:35.340 回答
3

看起来您在处理过程中离开了事务,因此accountRole被分离,或者由于其他原因它已经被分离。

在调用entityManager.merge(accountRole)之前调用entityManager.persist(account)应该修复它。

编辑:不幸的是,如果您不能确定accountRole数据库中是否已经存在,您将不得不通过查询来检查它。如果存在 - 合并,如果不存在 - 坚持。这确实很麻烦,但我还没有看到更好的解决方法。

EDIT2:您传递给该merge方法的实体将保持分离 - 托管实体将由 . 返回merge,因此您需要先合并,然后将 上的引用设置accountmerge.

于 2012-12-12T09:12:14.257 回答
0

你不能传递一个数据实体来持久化,没有办法。但你不需要。

您想Account独立于AccountRole(已经持久化)持久化一个。为了实现这一点,只需从子实体中删除级联@ManyToOneAccount在这种情况下):

public class Account {
    private AccountRole accountRole;

    @ManyToOne // no cascading here!
    public AccountRole getAccountRole() {
        return accountRole;
    }

在这里查看我的解释,为什么:https ://stackoverflow.com/a/54271569/522578

于 2019-01-19T22:28:49.130 回答