Iam为自己设计了一个小型应用程序,以了解JPA和休眠状态,并Iam寻找一些最佳实践。
现在我在实体User
和Group
与UserGroup
之间建立了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)我该怎么做才能摆脱对我的group
和UserGroup
映射的渴望获取?
3)是否应将数据访问权限限制为我的实体User
或Group
甚至User
之一?
感谢您分享知识;)
-编辑
我决定通过Group
处理UserGroup
和User
之间的关系,因为我想拥有一个访问点。
唯一的问题是,如果我添加一个新的Group
-UserGroup
关系,我将无法通过User
保留它,因为它们是分离的。我试图将新的Group
添加到生命周期挂钩UserGroup
的{{1}}和UserGroup
实体中,但这没有用。有什么建议可以使我正常工作吗?