正在删除具有单向关系的实体@ManyToOne(JPA)



我有问题,因为我不知道如何从User中删除特定角色。这个问题与Permission类中的单向关系有关。这些只是相关的代码片段。

Class Person

@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userId;
@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="user")
private Collection<Role> roles;

类别角色

@Entity
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long roleId;
@ManyToOne( fetch=FetchType.LAZY)
private User user;

我试图以这种方式从用户中删除特定角色

user.getRoles().remove(roleToRemove)
entityManger.merge(user)

roleToRemove已从集合中删除,但未从数据库中删除。(我写的测试已经完成)

所以,我添加了

 orphanRemoval = true

目前,我在Permission类中遇到了单向关系的问题。我收到DatabaseExeption作为我想要删除的idRole,它存在于Permission表中。

 @Entity
public class Permission {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long permissionId;
@ManyToOne( fetch=FetchType.LAZY)
private Role role;

所以,我的问题是如何处理这个问题。

您好,用户不是关系User-Role的所有者。你需要更新关系的拥有方,才能使其发挥作用。

user.getRoles().remove(roleToRemove)
roleToRemove.setUser(null)
entityManger.merge(user)

我的理解是,你不需要孤儿院。

这不是单向的,而是双向的关系。您需要维护用户角色关系的双方,以便对象模型反映数据库。让代码管理任何关系的双方是一种很好的做法,可以避免类似的问题。由于您已经从用户的角色集合中删除了角色,因此还需要清空角色对用户的引用,并合并用户和角色。

拥有方控制数据库中的外键,因此只会出现1条影响角色行的更新语句,但对象模型将与数据库同步,从而防止缓存也不同步。

最新更新