hibernate学习笔记--关联映射

1. 集合映射

案例:
老师与课程关系(一个老师可以带多门课程)
1.实体类设计

package demo2;

import java.util.HashSet;
import java.util.Set;

/**
 * Created by admin on 2017/6/19.
 */
public class Teacher {

    private int teaId;
    private String teaName;
    //一个老师对应多门课程
    private Set course = new HashSet();

    get方法 ....
    set方法 ....
}

2.映射文件配置






    
        
            
        
        

        
            
            
        
    



set集合属性的映射
name 指定要映射的set
table 集合属性要映射到的表
key 指定集合表(t_address)的外键字段
element 指定集合表的其他字段
type 元素类型,一定要指定

3.测试

package demo2;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

/**
 * Created by admin on 2017/6/19.
 */
public class Test {
    private static SessionFactory sf;
    static {
        sf = new Configuration()
                .configure()
                .addClass(Teacher.class)
                .buildSessionFactory();
    }

    @org.junit.Test
    public void test() {

        Teacher t = new Teacher();
        t.getCourse().add("语文");
        t.getCourse().add("数学");
        t.setTeaName("张三");

        Session session = sf.openSession();
        Transaction tx = session.beginTransaction();
        session.save(t);
        tx.commit();
        session.close();
        sf.close();
    }
}

4.运行结果

hibernate学习笔记--关联映射_第1张图片
图片.png

关联映射

案例:
老师与学生的关系(一个老师教多个学生,多个学生拥有一个老师)
1.实体类设计
Teacher.java

package demo4;

import java.util.HashSet;
import java.util.Set;

/**
 * Created by admin on 2017/6/19.
 */
public class Teacher {
    private int teaId;
    private String teaName;
    //一对多  一个老师对应多个学生
    private Set students = new HashSet<>();

    get方法 ....
    set方法 ....
}

Student.java

package demo4;

/**
 * Created by admin on 2017/6/19.
 */
public class Student {
    private int stuId;
    private String stuName;
    private String stuClass;
    //多对一   多个学生对应一个老师
    private Teacher teacher;

    get方法 ....
    set方法 ....

}

2.配置映射文件
Student.hbm.xml






    
        
            
        
        
        

        
    






Teacher.hbm.xml






    
        
            
        
        


        
            
            
        
    

    





3.测试 Test.jiav(一对多)

package demo4;

import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

/**
 * Created by admin on 2017/6/19.
 */
public class Test {
    private static SessionFactory sf;
    static {
        sf = new Configuration()
                .configure()
                .addClass(Teacher.class)
                .addClass(Student.class)
                .buildSessionFactory();
    }

    @org.junit.Test
    public void test() {
        //保存  一对多,一的一方的操作
        //老师
        Teacher t = new Teacher();
        t.setTeaName("张老师");
        //学生对象
        Student s1 = new Student();
        s1.setStuName("张三");
        s1.setStuClass("数学");
        Student s2 = new Student();
        s2.setStuName("李四");
        s2.setStuClass("语文");

        //关系
        t.getStudents().add(s1);
        t.getStudents().add(s2);

        //保存
        Session session = sf.openSession();
        Transaction tx = session.beginTransaction();
        session.save(s1);
        session.save(s2);
        session.save(t);

        tx.commit();
        session.close();
        sf.close();
    }
}

测试 Test.jiav(多对一)

package demo4;

import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

/**
 * Created by admin on 2017/6/19.
 */
public class Test2 {
    private static SessionFactory sf;
    static {
        sf = new Configuration()
                .configure()
                .addClass(Teacher.class)
                .addClass(Student.class)
                .buildSessionFactory();
    }

    @org.junit.Test
    public void test() {
        //保存  多对一 多的一方的操作
        //老师
        Teacher t = new Teacher();
        t.setTeaName("李老师");
        //学生对象
        Student s1 = new Student();
        s1.setStuName("Jack");
        s1.setStuClass("数学");
        Student s2 = new Student();
        s2.setStuName("Tom");
        s2.setStuClass("语文");

        //关系
//        t.getStudents().add(s1);
//        t.getStudents().add(s2);
        s1.setTeacher(t);
        s2.setTeacher(t);
        //保存
        Session session = sf.openSession();
        Transaction tx = session.beginTransaction();
        session.save(t);   //先保存一的方法
        session.save(s1);
        session.save(s2);  //再保存多的一方


        tx.commit();
        session.close();
        sf.close();
    }
}

4.运行结果

hibernate学习笔记--关联映射_第2张图片
一对多
hibernate学习笔记--关联映射_第3张图片
多对一

总结:
在一对多与多对一的关联关系中,保存数据最好的通过多的一方来维护关系,这样可以减少update语句的生成,从而提高hibernate的执行效率!

配置一对多与多对一,这种叫“双向关联”
只配置一对多, 叫“单项一对多”
只配置多对一, 叫“单项多对一”

注意:
配置了哪一方,哪一方才有维护关联关系的权限!

你可能感兴趣的:(hibernate学习笔记--关联映射)