hibernate 关联映射(三)---------many to many

本贴最后更新于 2723 天前,其中的信息可能已经时异事殊

关联关系-many to many

多对多关联关系,也是常见的关联关系,如商品和类别,雇员和项目,角色和用户等等。
模拟:从一对多延伸至多对多。一个雇员负责多个项目:如下图所示。思考:如果另一个雇员负责的项目与之重复呢(即多对多)?

雇员表 EMPLOYEES:

ea9da9b9b5e14fa59218dc5ec2b0ce68.png

项目表 PROJECTS:

2a5768b8848247ab9b070494e1cb8cee.png

根据上表分析,两张表不足以描述多对多的关联关系,所以需要中间表

雇员表:

6cbb14e0f0d444be8ba3f846ba31e4d1.png

中间表:

008ecae2360b4f88b18e8a995e7512a3.png

项目表

8c60e2f9bd7d4409830ab9f9a113b286.png

ER 图:

4efaaad8e6d848ed99c4dd5bb3213c13.png

实现过程(双向):

封装类:

**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"/>

单向即将两端任意一端的封装类的 set 属性去掉,对应的 hbm 文件中的 set 节点去掉。

单双向的区别即查询:

单向:通过这一端查询另一端,另一端查不了这一端。

双向:通过任意一端查另一端。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3195 引用 • 8215 回帖
  • private
    2 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...