【发布时间】:2015-07-22 13:18:00
【问题描述】:
我在使用 hibernate 来选择使用代表多对多的连接表时遇到了一些困难。
我有以下三个表(粗体代表链接/键)
用户{id、用户名、密码}
组 {id、名称、scpid}
加入表 = 成员 {id, groupId, 用户名}
所以我有这样的场景,在我的用户和组的 DAO 中,我想分别获取可用组和可用成员。
这意味着我需要提供映射,但不确定如何执行此操作。到目前为止,为了获取用户组,我已经尝试过类似的操作,但它抱怨用户名重复
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "member", joinColumns = {@JoinColumn(name = "username", nullable = false, updatable = false)}, inverseJoinColumns = {@JoinColumn(name = "username", nullable = false, updatable = false)})
public Set<Group> getGroups()
{
return userGroups;
}
public void setGroups(Set<Group> userGroups)
{
this.userGroups = userGroups;
}
谁能帮我确定我将如何解决这个问题?
谢谢
【问题讨论】:
-
应该是
inverseJoinColumns = {@JoinColumn(name = "groupId")},表示连接表中被引用实体的参与列名为groupId(根据您的示例)。 -
为什么是组ID?加入将在 user.username 上的表并加入 member.username?
-
运行您的代码并查看生成的 SQL 查询。这将回答您的问题,即为什么需要进行建议的更改才能生成正确的查询。
-
正确的注解应该是
@JoinTable(name = "member", joinColumns = {@JoinColumn(name = "username", referencedColumnName = "username", nullable = false, updatable = false)}, inverseJoinColumns = {@JoinColumn(name = "groupId", nullable = false, updatable = false)})。有关详细信息,请参阅@ManyToMany的 Javadocs。