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

时间:2016-07-21 16:25:37

标签: java jpa eclipselink one-to-many entitymanager

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

班级人员

@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已从Collection中删除,但未从datebase中删除。 (我写了完成的测试)

所以,我添加了

 orphanRemoval = true

目前我在Permission类中遇到单向关系问题。我收到了DatabaseExepction,因为idRole我想删除,存在于Permision表中。

 @Entity
public class Permission {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long permissionId;

@ManyToOne( fetch=FetchType.LAZY)
private Role role;

所以,我的问题是如何解决这个问题。

2 个答案:

答案 0 :(得分:0)

您好用户不是用户 - 角色关系的所有者。您需要更新关系的拥有端才能使其正常工作。

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

我的理解是你不需要孤儿移除。

答案 1 :(得分:-1)

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

拥有端控制数据库中的外键,因此只会发生1个影响角色行的更新语句,但是您的对象模型将与数据库同步,防止缓存也变得不同步。 / p>