关联映射之一对多、多对一映射
一、需求:
部门与员工
一个部门有多个员工 【一对多】
多个员工,属于一个部门 【多对一】
二、逻辑分析:
三、代码实现
1、javabean及映射文件的配置:
1)Employee.java、Employee.hbm.xml
2)Dept.java、Dept.hbm.xml
完整的Dept.hbm.xml配置:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="sram.oneTomany" auto-import="true">
<class name="Dept" table="t_dept">
<id name="deptId">
<generator class="native"></generator>
</id>
<property name="deptName" length="20"></property>
<!--
一对多关联映射的配置(通过部门管理员工)
Dept 映射关键点:
1. 指定 映射的集合属性: "emps"
2. 集合属性对应的集合表: "t_employee"
3. 集合表的外键字段 "t_employee. dept_id"
4. 集合元素的类型
table="t_employee"可以省略,
因为有对应的<one-to-many class="Employee"/>,
并且可以找到Employee.hbm.xml
如果写上,那么talbe的值"t_employee"一定要与
Employee.hbm.xml(<class name="Employee" table="t_employee">)中的表名一致
-->
<set name="emps" table="t_employee">
<!--
colunmn的值(dept_id),一定要与Employee.hbm.xml中的
<many-to-one name="dept" column="dept_id" class="Dept"></many-to-one>
的colunm值一致
-->
<key column="dept_id"></key>
<!--
class指定集合元素类型,sram.oneTomany.Employee,
但是因为<hibernate-mapping package="sram.oneTomany" auto-import="true">
这里已经指定包名,所以只写Employee就OK
-->
<one-to-many class="Employee"/>
</set>
</class>
</hibernate-mapping>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
2、测试类App1_save.java——实现保存的功能
package sram.oneToMany;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
public class App1_save {
public static SessionFactory sf;
static{
sf = new Configuration()
.configure()
.addClass(Dept.class)
.addClass(Employee.class)//测试使用
.buildSessionFactory();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
1)部门方(一的一方操作)
2)【推荐】员工方(多的一方操作)
3、数据库结果:
1)员工表:
2)部门表:
4、测试类App2_get.java——实现保存的功能
package sram.oneToMany;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
public class App1_save {
public static SessionFactory sf;
static{
sf = new Configuration()
.configure()
.addClass(Dept.class)
.addClass(Employee.class)//测试使用
.buildSessionFactory();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
1)通过部门方获取另一方:
2)通过员工方获取另一方:
四、总结:
1、在一对多与多对一的关联关系中,保存数据最好通过多的一方来维护关系,这样可以减少update语句的生成,从而提高hibernate的执行效率!
2、概念:
配置一对多与多对一,这种叫“双向关联”
只配置一对多,叫“单向一对多”
只配置多对一,叫“单向多对一”
3、注意:配置了哪一方,哪一方才有维护关联关系的权限!
转载自:https://blog.csdn.net/qq_34944851/article/details/53737332