博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate(六)一对多映射(多对一)
阅读量:4648 次
发布时间:2019-06-09

本文共 16150 字,大约阅读时间需要 53 分钟。

一、Hinbernate中持久化类的关联关系

在数据库中,表表之间是通过外键关联的,在程序中是要转化为持久化类也就是(JAVA Bean)来实例的。

但在Hibernater中持久化的之间的映射关系,不是通外键建立关联,而是通过属性.主要有以下几种

  • 一对一,
  • 一对多(多对一)
  • 多对多

关联方向:

  • 单向关联
  • 双向关联

二、一对多单向关联关系

2.1、建立数据库表

班级表,和学生表,学生生通过班级表中的,班级编号为外键

--班级表create table grade(       gid       number           primary key,  --班级ID       gname     varchar2(50),                  --班级名称       gdesc     varchar2(50)                   --班级介绍);--学生表create table student(       sid       number           primary key,  --主键ID学生ID       sname     varchar2(20),            --学生姓名       sex       varchar2(20),            --学生性别       gid       number           references grade(gid) ---外键班级ID);

2.2、建立持久化类和映射配置文件

班级和学生类

package entity;import java.util.HashSet;import java.util.Set;/* * 班级类 */public class Grade implements java.io.Serializable {    // Fields    private static final long serialVersionUID = 1L;    private int gid;    private String gname;    private String gdesc;    private Set
students = new HashSet
(); // Constructors /** default constructor */ public Grade() { } /** minimal constructor */ public Grade(int gid) { this.gid = gid; } /** full constructor */ public Grade(int gid, String gname, String gdesc, Set
students) { this.gid = gid; this.gname = gname; this.gdesc = gdesc; this.students = students; } // Property accessors public int getGid() { return this.gid; } public void setGid(int gid) { this.gid = gid; } public String getGname() { return this.gname; } public void setGname(String gname) { this.gname = gname; } public String getGdesc() { return this.gdesc; } public void setGdesc(String gdesc) { this.gdesc = gdesc; } public Set
getStudents() { return this.students; } public void setStudents(Set
students) { this.students = students; }}
View Code

 

学生类

package entity;/* * 学生类 */public class Student implements java.io.Serializable {    // Fields    private static final long serialVersionUID = 1L;    private int sid;        private String sname;    private String sex;    // Constructors    /** default constructor */    public Student() {    }    /** minimal constructor */    public Student(int sid) {        this.sid = sid;    }    /** full constructor */    public Student(int sid, String sname, String sex ) {            this.sid = sid;        this.sname = sname;        this.sex = sex;    }    // Property accessors    public int getSid() {        return this.sid;    }    public void setSid(int sid) {        this.sid = sid;    }        public String getSname() {        return this.sname;    }    public void setSname(String sname) {        this.sname = sname;    }    public String getSex() {        return this.sex;    }    public void setSex(String sex) {        this.sex = sex;    }}
View Code

 

 

hibernate.cf.xml和班级、学生的配置文件

org.hibernate.dialect.Oracle9Dialect
jdbc:oracle:thin:@localhost:1521:orcl
root
root
oracle.jdbc.OracleDriver
true
true

持久类配置先来学生类

班级类配置

测试类

package Test;import java.util.Set;import org.hibernate.Session;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import entity.Grade;import entity.Student;public class Demo1 {    /**     * 测试类     */    public static void main(String[] args) {        save();         find();        update();    }    public static void save() {        // 声明班级对象,并赋值        Grade grade = new Grade();        grade.setGid(201504);        grade.setGname("Java一班");        grade.setGdesc("刚开始学习JAVA");        // 声明2个学生对象        Student stu1 = new Student();        stu1.setSid(201504012);        stu1.setSname("张三");        stu1.setSex("男");        Student stu2 = new Student();        stu2.setSid(201504013);        stu2.setSname("李四");        stu2.setSex("女");        // 将学生添加到班级        grade.getStudents().add(stu1);        grade.getStudents().add(stu2);        // 建立session        Session session = new Configuration().configure().buildSessionFactory()                .openSession();        // 开始事务        Transaction transaction = session.beginTransaction();        // 保存班级        session.save(grade);        // 保存学生        session.save(stu1);        session.save(stu2);        // 提交事务        transaction.commit();        // 关闭session        session.close();    }    /*     * 将基中一个学生更改为别一个班级     */    public static void update() {        // 声明班级对象,并赋值        Grade grade = new Grade();        grade.setGid(201506);        grade.setGname("Java二班");        grade.setGdesc("学习JAVA二年级");        // 获取一个学生的信息        // 建立session        Session session = new Configuration().configure().buildSessionFactory()                .openSession();        // 开始事务        Transaction transaction = session.beginTransaction();        Student stu1=(Student) session.get(Student.class, 201504013);        //将学生添加到这个新的班级        grade.getStudents().add(stu1);        // 保存班级        session.save(grade);        // 保存学生        session.save(stu1);        // 提交事务        transaction.commit();        // 关闭session        session.close();    }    // 查询班级    public static void find() {        // 建立session        Session session = new Configuration().configure().buildSessionFactory()                .openSession();        Grade g = (Grade) session.get(Grade.class, 201504);        System.out.println("班级信息:" + g.getGid() + "\t" + g.getGname()                + g.getGdesc());        // 通过班级获取这个班级的学生信息        System.out.println("201504班的学生信息如下:");        Set
set = g.getStudents(); for (Student stu : set) { System.out.println(stu.getSid() + "\t" + stu.getSname() + "\t" + stu.getSex()); } }}

以上只上单向关联,一般都会有双向关联

同样要在学生类中添加Grade 属性

在学生类的配置文件中配置关联字段

 二、建立双向关联

2.1、更改学生类和配置文件

package entity;/* * 学生类 */public class Student implements java.io.Serializable {    // Fields    private static final long serialVersionUID = 1L;    private int sid;    private String sname;    private String sex;    //增加班级属性    private Grade grade;    // Constructors    /** default constructor */    public Student() {    }    /** minimal constructor */    public Student(int sid) {        this.sid = sid;    }    /** full constructor */    public Student(int sid, String sname, String sex ) {            this.sid = sid;        this.sname = sname;        this.sex = sex;    }    // Property accessors    public int getSid() {        return this.sid;    }    public void setSid(int sid) {        this.sid = sid;    }        public String getSname() {        return this.sname;    }    public void setSname(String sname) {        this.sname = sname;    }    public String getSex() {        return this.sex;    }    public void setSex(String sex) {        this.sex = sex;    }    public Grade getGrade() {        return grade;    }    public void setGrade(Grade grade) {        this.grade = grade;    }    }

配置文件 

2.2、测试类

建立双向关联后,就可以通过学生来获取班级信息

清空数据表中的数据

package Test;import org.hibernate.Session;import org.hibernate.cfg.Configuration;import entity.Student;public class Demo2 {    /**     * 测试类     */    public static void main(String[] args) { save();findByStu();    }        public static void findByStu(){        Session session = new Configuration().configure().buildSessionFactory()                .openSession();        //获取一个学生的信息 get方法为通过主键查询        Student stu=(Student) session.get(Student.class, 201504013);        System.out.println("学生信息:\t"+stu.getSid()+"\t"+stu.getSname()+"\t"+stu.getSex());        //通过学生信息得到班级信息        System.out.println("这个学生的班级信息:"+stu.getGrade().getGid()+"\t"+stu.getGrade().getGname()+"\t"+stu.getGrade().getGdesc());    }}public static void save() {// 声明班级对象,并赋值Grade grade = new Grade();grade.setGid(201504);grade.setGname("Java一班");grade.setGdesc("刚开始学习JAVA");// 声明2个学生对象Student stu1 = new Student();stu1.setSid(201504012);stu1.setSname("张三");stu1.setSex("男");stu1.setGrade(grade);Student stu2 = new Student();stu2.setSid(201504013);stu2.setSname("李四");stu2.setSex("女");stu2.setGrade(grade);// 将学生添加到班级/*grade.getStudents().add(stu1);grade.getStudents().add(stu2);*/// 建立sessionSession session = new Configuration().configure().buildSessionFactory().openSession();// 开始事务Transaction transaction = session.beginTransaction();// 保存班级session.save(grade);// 保存学生session.save(stu1);session.save(stu2);// 提交事务transaction.commit();// 关闭sessionsession.close();}

三、级联保存和删除

能不能只保存学生时,同时保存班级呢,或者保存班级时,同时保存学生呢

3.1、cascade属性

 

保存班级时,同时保存学生信息

修改班级配置,在set标签中添加cascade属性,设置为save-update

测试类

package Test;import org.hibernate.Session;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import entity.Grade;import entity.Student;public class Demo3 {    /**     * @param args     */    public static void main(String[] args) {        save();    }    public static void save() {        // 声明班级对象,并赋值        Grade grade = new Grade();        grade.setGid(201504);        grade.setGname("Java一班");        grade.setGdesc("刚开始学习JAVA");        // 声明2个学生对象        Student stu1 = new Student();        stu1.setSid(201504012);        stu1.setSname("张三");        stu1.setSex("男");        stu1.setGrade(grade);                        Student stu2 = new Student();        stu2.setSid(201504013);        stu2.setSname("李四");        stu2.setSex("女");        stu2.setGrade(grade);        // 将学生添加到班级        grade.getStudents().add(stu1);        grade.getStudents().add(stu2);        // 建立session        Session session = new Configuration().configure().buildSessionFactory()                .openSession();        // 开始事务        Transaction transaction = session.beginTransaction();        // 保存班级        session.save(grade);        // 保存学生        //session.save(stu1);        //session.save(stu2);        // 提交事务        transaction.commit();        // 关闭session        session.close();    }}

反之,在学生类的配置文件one-many中添加cascade属性设置为save-update

package Test;import org.hibernate.Session;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import entity.Grade;import entity.Student;public class Demo3 {    /**     * @param args     */    public static void main(String[] args) {        save();    }    public static void save() {        // 声明班级对象,并赋值        Grade grade = new Grade();        grade.setGid(201504);        grade.setGname("Java一班");        grade.setGdesc("刚开始学习JAVA");        // 声明2个学生对象        Student stu1 = new Student();        stu1.setSid(201504012);        stu1.setSname("张三");        stu1.setSex("男");        stu1.setGrade(grade);                        Student stu2 = new Student();        stu2.setSid(201504013);        stu2.setSname("李四");        stu2.setSex("女");        stu2.setGrade(grade);        // 将学生添加到班级        grade.getStudents().add(stu1);        grade.getStudents().add(stu2);        // 建立session        Session session = new Configuration().configure().buildSessionFactory()                .openSession();        // 开始事务        Transaction transaction = session.beginTransaction();        // 保存班级        //session.save(grade);        // 保存学生        session.save(stu1);        session.save(stu2);        // 提交事务        transaction.commit();        // 关闭session        session.close();    }}
View Code

 

3.2、inverse属性

 

首先在班级类中设置invers属性为false时,删除班级

View Code

测试类

package Test;import org.hibernate.Session;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import entity.Grade;import entity.Student;public class Demo4 {    /**     * @param args     */    public static void main(String[] args) {        delete() ;    }    public static void delete() {                // 建立session        Session session = new Configuration().configure().buildSessionFactory()                .openSession();        // 开始事务        Transaction transaction = session.beginTransaction();        // 保存班级        Grade grade=(Grade) session.get(Grade.class, 201504);        // 保存学生        session.delete(grade);        // 提交事务        transaction.commit();        // 关闭session        session.close();    }}
View Code

结果:发现班级表中的班级已经删除,而学生表中数据没有删除,只是GID字段为NULL

下面将inverse设置为true时,添加新学生,和新的班级

View Code

测试类

package Test;import org.hibernate.Session;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import entity.Grade;import entity.Student;public class Demo4 {    /**     * @param args     */    public static void main(String[] args) {        delete() ;    }    public static void delete() {                // 声明班级对象,并赋值                Grade grade = new Grade();                grade.setGid(201509);                grade.setGname("Java三班");                grade.setGdesc("ASP.NET");                // 声明2个学生对象                Student stu1 = new Student();                stu1.setSid(201509009);                stu1.setSname("王五");                stu1.setSex("女");                stu1.setGrade(grade);                                Student stu2 = new Student();                stu2.setSid(201509045);                stu2.setSname("赵六");                stu2.setSex("女");                stu2.setGrade(grade);                // 建立session        Session session = new Configuration().configure().buildSessionFactory()                .openSession();        // 开始事务        Transaction transaction = session.beginTransaction();                    // 保存学生        session.save(stu1);        session.save(stu2);        // 提交事务        transaction.commit();        // 关闭session        session.close();    }}
View Code

结果发现,我并没有用班级添加学生,也没有保存班级,只是保存了学生,班级信息一起保存了 

转载于:https://www.cnblogs.com/liunanjava/p/4336126.html

你可能感兴趣的文章
绩效考核如何快速评分
查看>>
ssm项目启动,加载数据库连接池时卡住
查看>>
CGRect包含交错,边缘,中心的检测
查看>>
respondsToSelector的相关使用
查看>>
zabbix 自定义监控项 获取nginx监控状态
查看>>
python 并发编程 多线程 目录
查看>>
C main()参数
查看>>
javaTemplates-学习笔记四
查看>>
jQuery 时间获取扩展
查看>>
Windows Phone开发(28):隔离存储B 转:http://blog.csdn.net/tcjiaan/article/details/7436959...
查看>>
WP7中对ListBox的ItemTemplate中子元素的后台操作
查看>>
调查研究
查看>>
CMOS Sensor的调试经验分享(转)
查看>>
看的论文列表
查看>>
Linux下捕捉信号
查看>>
开发人员如何有效的进行数据库设计
查看>>
VS2017设置背景主题
查看>>
基于visual Studio2013解决C语言竞赛题之1010计算
查看>>
css3 3d旋转动画
查看>>
tpcc
查看>>