使用附加列进行多对多映射?

时间:2012-08-09 10:21:21

标签: hibernate

我需要在manytomany生成的表中添加其他列作为

有2个实体彼此相关多少个 (User ManytoMany Group)

@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个表

table1 - 用户

table2 - 组

table3 - UserGroup

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

Additonal字段将是

private boolean isThisUserIsGroupManager;

所以,我可以让这个群组的用户也是一个群组经理。

3 个答案:

答案 0 :(得分:4)

关系没有要设置的持久属性,只有实体有。这就是为什么你需要第三个实体的原因。它将具有两个@Id属性,因此需要@IdClass,因为身份来自GroupUser

@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 extends Serializable {
    int user;
    int group;
    ...
}

答案 1 :(得分:1)

实际上,您可以执行多对多关联,包括额外列。

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

其次,有关使用其他列的示例,请参阅Mkyong.com上的this tutorial

要记住的事情,以及教程没有明确指出的是,存储关联信息通常的表没有额外的列,这隐含地使主键成为复合参与实体的密钥:UserGroup中的密钥组合了user.id和group.id。因此,您需要@AssociationOverride标记来指定构成密钥的哪个字段,因为如果不这样做,Hibernate将使用所有字段

是否良好实践是一个不同的问题,与具有单独的实体(例如,UserGroupInfo,在您的情况下将是第四个实体)相比,它是否会改善性能是唯一目的是保存额外的列(UserGroupInfo将必须重用UserGroup的id)。

答案 2 :(得分:0)

你不能直接在Hibernate中这样做。

你需要做很多 - 一个然后一个 - 许多映射。

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