猿问

使用 FK“重用”保存实体

我正在使用 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 = 0

A.b.id = 0

A.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 是否有意义?似乎他们更了解可能的角色。有点像枚举类型的行为?


明月笑刀无情
浏览 69回答 1
1回答

汪汪一只猫

如果没有完整的代码,很难弄清楚发生了什么。但总的来说,您应该考虑以下概念:带注释的实体JoinTable是关系的所有者。这意味着如果您启用Cascade.Merge“Owner”,向其中添加新记录,则会向中间表添加另一条记录。一个例子Role实体:{&nbsp; @ManyToMany(cascade = {CascadeType.MERGE})&nbsp; &nbsp; @JoinTable(name = "tb_role_privilege",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; joinColumns = @JoinColumn(name = "role_id"),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inverseJoinColumns = @JoinColumn(name = "privilege_id"))&nbsp; &nbsp; private Set<Privilege> privileges = new HashSet<>();}和Privilege实体:{&nbsp; &nbsp; &nbsp; @ManyToMany(mappedBy = "privileges")&nbsp; &nbsp; 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人际关系方法。如果它不满足您的场景,请为您的代码提供更多信息。
随时随地看视频慕课网APP

相关分类

Java
我要回答