设计员工,岗位关系,多对多双向关联。
类图:
用Hibernate创建的表图:
实体类:
public class User {
private Long id;
private Set<Role> roles = new HashSet<Role>();
}
public class Role {
private Long id;
private Set<User> users = new HashSet<User>();
}
映射文件:
<class name="User" table="oa_user">
<id name="id">
<generator class="native" />
</id>
<!-- roles 属性, 本类与Role为多对多关系 -->
<set name="roles" table="oa_user_role">
<key column="userId"></key>
<many-to-many class="Role" column="roleId"></many-to-many>
</set>
</class>
<class name="Role" table="oa_role">
<id name="id">
<generator class="native"/>
</id>
<!-- users 属性, 本类与User为多对多关系 -->
<set name="users" table="oa_user_role">
<key column="roleId"></key>
<many-to-many class="User" column="userId"></many-to-many>
</set>
</class>
Annotation方式一般考虑不全:
User类:
@ManyToMany
@JoinTable(name="_role_user",
joinColumns=@JoinColumn(name="user_id",referencedColumnName="id"),
inverseJoinColumns=@JoinColumn(name="role_id",referencedColumnName="id"))
public Set<Role> getRoles() {
return roles;
}
Role类
@ManyToMany
@JoinTable(name="_role_user",
joinColumns=@JoinColumn(name="role_id",referencedColumnName="id"),
inverseJoinColumns=@JoinColumn(name="user_id",referencedColumnName="id"))
public Set<User> getUsers() {
return users;
}
Annotation方式困扰很久,中间表一直无法插入数据。
为了知识完整性起见,所以在项目各种关联关系都用到了。日后工作中建议还是不要使用多对多双向关联,用多对一 一对多。