【问题标题】:removing entity with unidirectional relationship @ManyToOne (JPA)删除具有单向关系@ManyToOne(JPA)的实体
【发布时间】:2016-07-21 16:25:37
【问题描述】:

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

类人

@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 中删除,但未从数据库中删除。 (我写的测试已经完成)

所以,我添加了

 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;

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 您是否注意到我在回答中已经解决了这个问题 - “关系所有者”和“从两端更新关系”?如果您认为需要更多详细信息,您应该在我的答案中发布。在改进写作风格的同时玩鹦鹉游戏,我不认为这是一种高品味的表现。
      • 风格和品味在情人眼中,但你的回答只对了一半,因为它没有提到需要合并角色。如果您希望它完整且对可能遇到类似问题的人更有用,请随时使用更多信息更新您的答案 - 如果您涵盖所有内容,我会很乐意删除我的答案。否则,OP 可以决定“最佳”答案——毕竟,这就是在这样的网站上允许多个答案的关键。
      • 这是一个可怕的错觉。两端合并是 100% 不必要的。 stackoverflow.com/questions/20068742/…我想你现在应该给我一票睁开你的眼睛:)
      • 呃,我认为您误读了您链接到的答案,这就是为什么我的答案是绝对需要的。如果您对关系进行了级联合并,那么当您添加引用时就可以使用,但是如果不再引用,级联合并到底如何找到对角色的更改?如果您正在使用分离的实体,则需要将两者显式合并回持久性单元。否则,根本不需要合并。
      • 你怎么知道她正在与分离的实体合作?她有没有在问题中写下她的顺序是什么?不,你和我一样正确。这意味着基于上下文的正确性。
      猜你喜欢
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 2013-05-22
      • 2021-08-08
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多