在我的应用程序中,我有不同的User
和Item
,因此每个用户都可以选择许多项目。
在教程中我了解了 @ManyToMany
注释。
@Entity
public class Item extends Model {
...
@ManyToMany(cascade = CascadeType.REMOVE)
public List<User> users = new ArrayList<User>();
但我能想到的第二个选择是为用户到项目关系定义一个单独的类,以便我可以添加其他信息,例如日期和时间。
@Entity
public class ItemUserRel extends Model {
@Id
public Long id;
public User user;
public Item item;
//additional information
public Date date;
...
这两个选项中哪一个设计更好,为什么?
最佳答案
我不久前也遇到过类似的问题。我还必须处理模型 User
和模型 Group
。我的要求是:
用户可以拥有 n 个 可读
和 n 可写
组。这些权限必须存储在第三个表中(不在用户表中,也不在组表中)。还有其他属性,例如 authorizedBy
和 'authorizedOn'。所以@ManyToMany不起作用,因为我没有真正控制它。此外,附加属性使得很难通过 JPA 进行映射。
也许其他设计也是可能的,但我(仍然)认为引入一个新类 UserGroup
是最好的。此类与单个 User
具有 @ManyToOne
关系。
我最终定义了这三个模型:
- 用户
- 群组 - 有关群组模型的一般信息
- UserGroup - 包含其他字段,例如:
permissions
、authorizedBy
、authorizedOn
等
在我的 User 模型上,我会有 getter getUserGroups()
,但也有 getPersonalGroup()
,它基本上是 Group
的一个(个人)实例> 在 getUserGroups()
中,但其中 createdBy
和 authorizedBy
是同一用户。
我发现这个设计更易于维护,也更清晰。此外,这种设计还帮助我创建了一个舒适的用户界面,管理员可以在其中管理和更改用户组的权限。
也许更有用的信息
关于java - 玩2框架多对多关系更好的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19015472/