我有一个双向多对多的关系 Role
以及 Scope
. 创造这两个实体,甚至他们的孩子的帮助下 CascadeType.PERSIST
简单明了。
这个 Role
实体简化为:
@Entity
@Table(uniqueConstraints = @UniqueConstraint(name = "role_name", columnNames = "name"))
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST, mappedBy = "roles")
private Set<Scope> scopes;
}
以及 Scope
:
@Entity
@Table(uniqueConstraints = @UniqueConstraint(name = "scope_name", columnNames = "name"))
public class Scope {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
@JoinTable(name = "role_scopes", joinColumns = @JoinColumn(name = "scope_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
@ManyToMany(cascade = CascadeType.REMOVE)
private Set<Role> roles;
}
它们的存储库很简单 CrudRepository
扩展名:
public interface RoleRepository extends CrudRepository<Role, Long> {}
public interface ScopeRepository extends CrudRepository<Scope, Long> {}
以下代码段举例说明了实体插入:
Role adminRole = roleRepository.save(new Role("ADMIN"));
Scope allReadScope = scopeRepository.save(new Scope("all.read"));
Scope allWriteScope = scopeRepository.save(new Scope("all.write"));
``` `Role` 以及 `Scope` 在 `CascadeType.PERSIST` ,如下所示:
Role managedRole = roleRepository.save(new Role("ADMIN", new Scope("all.read"), new Scope("all.write")));
然而。。。更新 `managedRole` 导致 `org.hibernate.PersistentObjectException: detached entity passed to persist` 例外情况:
managedRole.getScopes().remove(allReadScope);
roleRepository.save(managedRole); // PersistentObjectException!
我试着修改 `Role::scopes` 的 `CascadeType` 也包括 `DETACH` , `MERGE` 和/或 `REFRESH` 没有成功。我们该怎么办?
1条答案
按热度按时间41ik7eoe1#
很可能您会面临这个问题,因为在双向Map中您没有维护关系的双方。让我们说进来
Role
:老实说,我会完全放弃双向Map。保持这种状态真是一场噩梦。