我需要在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;
所以,我可以让这个群组的用户也是一个群组经理。
答案 0 :(得分:4)
关系没有要设置的持久属性,只有实体有。这就是为什么你需要第三个实体的原因。它将具有两个@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 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中这样做。
你需要做很多 - 一个然后一个 - 许多映射。
您需要在映射表上添加一列。我假设你也会为它设置一些价值。如果没有将实体映射到该表,则无法做到这一点。