关联关系-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"/>
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于