为了账号安全,请及时绑定邮箱和手机立即绑定

使用 FK“重用”保存实体

使用 FK“重用”保存实体

明月笑刀无情 2024-01-28 16:46:36
我正在使用 Spring + Hibernate JPAA。我有一个实体:A  id (PK)  Set<B> b;  otherProps…B  id (PK)  String name; (unique)  otherProps…并且有一个M到M的表链接A.id,B.id。如果用户创建一个实体:A.id = 0A.b.id = 0A.b.Name = "Admin";它会保存,但会在 B 表中创建一个新条目。将 B 视为系统定义的“角色”表,它不应该改变。所以我希望它重新使用 Admin 并自动填充 id。该对象来自 REST api…在这种情况下调用者是否应该知道 id 和名称?或者他们应该只能通过 id 或名称填充?遇到这种情况该如何处理呢?或者把id去掉,用名字作为PK会更好吗?编辑:澄清...用户实体角色实体UserRole表与User.Id、Role.Id M2M关系。角色表包含: 1 用户 2 管理员 3 超级用户那是我定义的固定表。不允许调用者添加角色。因此,如果User1是用户,那么M2M表1,1中将会有一个条目。现在,想象一下如果有人传入一个角色为“User”的新用户对象 User2。就像现在一样,它在 Roles id=4 value=User 中创建一个条目(重复条目),并在 M2M 表中创建一个 1,4,其中预期行为为 1,1,即重用现有的“用户”角色。基本上,我想调用者知道用户 id 是有意义的,但我不确定调用者知道角色 id 是否有意义?似乎他们更了解可能的角色。有点像枚举类型的行为?
查看完整描述

1 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

如果没有完整的代码,很难弄清楚发生了什么。但总的来说,您应该考虑以下概念:


带注释的实体JoinTable是关系的所有者。这意味着如果您启用Cascade.Merge“Owner”,向其中添加新记录,则会向中间表添加另一条记录。


一个例子


Role实体:


{

  @ManyToMany(cascade = {CascadeType.MERGE})

    @JoinTable(name = "tb_role_privilege",

            joinColumns = @JoinColumn(name = "role_id"),

            inverseJoinColumns = @JoinColumn(name = "privilege_id"))

    private Set<Privilege> privileges = new HashSet<>();

}

和Privilege实体:


{

      @ManyToMany(mappedBy = "privileges")

    private Set<Role> roles = new HashSet<Role>();

}

这里,Role是关系的所有者。当您使用 创建角色对象 并使用 ,id=0填充其权限列表并ids=[0 1 2]调用 时save,它会将角色记录插入到 中tb_role,并且还会将 (0,0)、(0,1) 和 (0,2) 插入到中间表tb_role_privilege,但它不会向 中插入任何内容tb_privilege。因此,您需要在tb_privilege插入角色记录之前插入权限记录。


这是一种良好且简单的m2m人际关系方法。如果它不满足您的场景,请为您的代码提供更多信息。


查看完整回答
反对 回复 2024-01-28
  • 1 回答
  • 0 关注
  • 68 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信