【问题标题】:How to use join tables with hibernate如何在休眠中使用连接表
【发布时间】: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。

标签: java mysql hibernate dao


【解决方案1】:

根据提供的代码 sn-p,@JoinColumnname 属性都具有 username 作为值。

【讨论】:

  • 为什么不是用户名?加入将在 user.username 上的表并加入 member.username?
  • @JoinTable 注释用于创建链接表@JoinColumn 注释用于引用两个表中的链接列.在这种情况下,第一个 @JoinColumn 应该引用当前表(用户)id,第二个应该引用组表 id。如果您不熟悉 JPA/Hibernate 映射,请查看 this 基本示例。此外,您的链接表有一个额外的列,因此@JoinTable 将不起作用。详情请查看answer
猜你喜欢
  • 2013-09-25
  • 2017-07-30
  • 2016-09-07
  • 2015-10-06
  • 2016-05-17
  • 2020-09-06
  • 2018-11-16
  • 1970-01-01
相关资源
最近更新 更多