关联关系-many to many
多对多关联关系,也是常见的关联关系,如商品和类别,雇员和项目,角色和用户等等。
模拟:从一对多延伸至多对多。一个雇员负责多个项目:如下图所示。思考:如果另一个雇员负责的项目与之重复呢(即多对多)?
雇员表 EMPLOYEES:
项目表 PROJECTS:
根据上表分析,两张表不足以描述多对多的关联关系,所以需要中间表。
雇员表:
中间表:
项目表
ER 图:
实现过程(双向):
封装类:
**public** **class** Employee {
**private** **int** employeeId;
**private** String empName;
**private** Set projects = **new** HashSet<>();
//省略getset
}
**public** **class** Project {
**private** **int** projectId;
**private** String projectName;
**private** Set emps = **new** HashSet<>();
//省略getset
}
对象关系映射文件:
在双向中:两端同时维护关联关系,也就是说保存都会向中间表中插入数据,会导致主键重复插入异常,所以我们需要在某端设置 inverse=“true”,只让一端维护关联关系。
Emp.hbm.xml:
<hibernate-mapping>
<class name="base.n2n.Employee" table="EMPLOYEES">
<id name="employeeId" column="EMPLOYEE_ID">
<generator class="increment"></generator>
</id>
<property name="empName" column="EMP_NAME"></property>
<!--中间表 -->
<set name="projects" table="EMPLOYEES_PROJECTS">
<key>
<!--指定本类对应的中间表外键列-->
<column name="E_ID">
</key>
<!--指定映射类型 及映射该类型所根据的中间表的外键
即project类对应在中间表中的外键列 -->
<many-to-many class="base.n2n.Project" column="P_ID"></one-to-one>
</set>
</class>
</hibernate-mapping>
Pro.hbm.xml:
<hibernate-mapping>
<class name="base.n2n.Project" table="PROJECTS">
<id name="projectId" column="PROJECT_ID">
<generator class="increment"></generator>
</id>
<property name="projectName" column="PROJECT_NAME"></property>
<!--中间表 -->
<set name="emps" table="EMPLOYEES_PROJECTS">
<key>
<column name="P_ID">
</key>
<many-to-many class="base.n2n.Employee" column="E_ID"></one-to-one>
</set>
</class>
</hibernate-mapping>
Hibernate.cfg.xml:
<mapping resource="base/n2n/Project.hbm.xml"/>
<mapping resource="base/n2n/Employee.hbm.xml"/>
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于