2

我需要在 manytomany 生成的表中有额外的列

有 2 个实体相互关联,多对多(用户多对多组)

@Entity
public class User {
    //other fields
    private Set<Group> groups = new HashSet<Group>(0);
}

@Entity
public class Group {
    //other fields
    private Set<User> users = new HashSet<User>(0);
}

所以在这里它在数据库中生成3个表

表 1 - 用户

表 2 - 组

表 3 - 用户组

现在我需要 UserGroup 表中的附加字段,那么如何指定该字段以及在哪个实体中?

附加字段将是

私有布尔 isThisUserIsGroupManager;

这样,我可以让该组的用户也是组管理员。

4

3 回答 3

6

关系没有要设置的持久属性,只有实体有。这就是为什么你需要第三个实体。它将有两个@Id属性,因此@IdClass是必需的,因为身份是从Group和派生的User

@Entity
public class User {
    @Id int id;    
    @OneToMany(mappedBy = "user")
    private Set<GroupMemberShip> groupMemberShips;
    ...
}

@Entity
public class Group {
    @Id int id;
    @OneToMany(mappedBy = "group")
    private Set<GroupMemberShip> groupMemberShips;
    ...
}


@Entity
@IdClass(GroupMemberShipId.class)
public class GroupMemberShip {
    @Id @ManyToOne User user;

    @Id @ManyToOne Group group;

    private boolean isThisUserIsGroupManager;
    ...
}

public class GroupMemberShipId implements Serializable {
    int user;
    int group;
    ...
}
于 2012-08-09T12:07:39.647 回答
1

实际上,您可以进行多对多关联,包括使用额外的列。

首先,多对多映射是 Hibernate 的一个特性。您可以在第 1 章“映射关联”部分的 Hibernate (3.5.1-final) 参考中找到它。只需搜索“多对多”(在我拥有的 PDF 文件中的“1.2. 2. 一个单向的基于集合的关联”是您正在寻找的 - 它在第 14 页和第 14 页上有一个示例,就像您的一样)。因此,当其他响应者说您需要使用两个多对一映射时,我可能对他们指的是什么感到困惑,因为上述示例也有三个表。

其次,有关使用附加列的示例,请参阅Mkyong.com 上的本教程

需要记住的一点是,本教程没有明确说明,存储关联信息的表通常没有额外的列,这隐含地使主键成为参与实体键的组合:UserGroup 中的键结合了 user.id 和 group.id。所以你需要@AssociationOverride 标签来指定哪些字段构成了键,因为如果你不这样做,Hibernate 将使用所有字段作为

这是否是一个好的做法是一个不同的问题,与拥有一个单独的实体(例如,UserGroupInfo,在您的情况下是第四个)相比,它是否会提高性能,其唯一目的是持有额外的列(UserGroupInfo 将不得不重用 UserGroup 的 id)。

于 2013-09-05T10:04:45.283 回答
0

您不能直接在 Hibernate 中执行此操作。

您需要先进行多 - 一,然后再进行一 - 多映射。

您需要在映射表上增加一列。我假设你也会为它设置一些价值。如果没有将实体映射到该表,您将无法做到这一点。

于 2012-08-09T10:24:56.523 回答