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

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

关联关系-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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • private
    2 引用

相关帖子

欢迎来到这里!

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

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