JPA ManyToMany复合密钥

时间:2019-12-03 12:06:03

标签: java hibernate jpa orm mapping

Iam为自己设计了一个小型应用程序,以了解JPA和休眠状态,并Iam寻找一些最佳实践。

现在我在实体UserGroupUserGroup之间建立了ManyToMany关系,以将它们映射在一起。我的实体UserGroup具有属性isGroupAdmin,这就是为什么我必须与其他实体建立关系的原因。

我可以进行所有工作,但是我怀疑我的解决方案是否高效,我希望获得一些有关优化的信息。为了简单起见,我只发布必要的属性:

用户

@Entity
@Table(name = "Userdata")
public class User {

  @Id
  @GeneratedValue
  @Column(name = "Id", columnDefinition = "uniqueidentifier")
  private UUID id;

  @Column(name = "Username", columnDefinition = "nvarchar(30)", nullable = false, unique = true)
  private String username;

  @OneToMany(mappedBy = "user", cascade = CascadeType.ALL,
      orphanRemoval = true, fetch = FetchType.EAGER)
  private Set<UserGroup> userGroups;

  // ----- Getters, Setters, Constructor and equals/hash ommitted for readability

@Entity
@Table(name = "Groups")
public class Group {

  @Id
  @GeneratedValue
  @Column(name = "Id", columnDefinition = "uniqueidentifier")
  private UUID id;

  @Column(name = "Name", nullable = false)
  private String name;

  @OneToMany(mappedBy = "group", cascade = CascadeType.ALL,
      orphanRemoval = true, fetch = FetchType.EAGER)
  private Set<UserGroup> groupUsers;

  // ----- Getters, Setters, Constructor and equals/hash ommitted for readability

UserGroup

@Entity
@Table(name = "user_group")
public class UserGroup {

  @PrePersist
  private void prePersist() {
    if (getId() == null) {
      GroupAdminKey pk = new GroupAdminKey();
      pk.setUserId(user.getId());
      pk.setGroupId(group.getId());
      id = pk;
    }
  }

  @EmbeddedId
  GroupAdminKey id;

  @ManyToOne
  @MapsId("userId")
  private User user;

  @ManyToOne
  @MapsId("groupId")
  private Group group;

  private boolean isGroupAdmin;

  @PreRemove
  private void synchronizeRelations() {
    group.getGroupUsers().remove(this);
    user.getUserGroups().remove(this);
  }

现在,我可以将User添加到Group,也可以将Group添加到User。我可以通过提供Users来获得我所有的Group,反之亦然。从Users删除Group也是一样,反之亦然。 我也可以通过查询我的UserGroup实体来获取它们,甚至可以通过UserGroup删除该关系。

我对使用fetch = FetchType.EAGER也不太满意。据我了解,Hibernate的主要优势之一是延迟加载功能。

最后,我的问题是: 1)我应该如何访问我的实体? (我可以在提供新的Group的{​​{1}}上添加User,也可以在提供新的UserGroup的{​​{1}}上添加User

2)我该怎么做才能摆脱对我的groupUserGroup映射的渴望获取?

3)是否应将数据访问权限限制为我的实体UserGroup甚至User之一?

感谢您分享知识;)

-编辑

我决定通过Group处理UserGroupUser之间的关系,因为我想拥有一个访问点。

唯一的问题是,如果我添加一个新的Group-UserGroup关系,我将无法通过User保留它,因为它们是分离的。我试图将新的Group添加到生命周期挂钩UserGroup的{​​{1}}和UserGroup实体中,但这没有用。有什么建议可以使我正常工作吗?

0 个答案:

没有答案