Hibernate 关联映射(一对多、多对一)

关联映射之一对多、多对一映射

一、需求: 
部门与员工 
一个部门有多个员工 【一对多】 
多个员工,属于一个部门 【多对一】

二、逻辑分析: 

三、代码实现 
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值