Hibernate框架关系映射
admin
2023-06-07 10:21:54
0

接触Hibernate也有一小段的时间了,愈发的觉得Hibernate是个神奇的东西,为什么这么说呢?因为你可以不懂一行sql,直接面向对象,就可以将数据直接保存到数据库去!!

你还可以保存一个对象,然后一次性的将与它相关的所有数据保存到数据库,比如说,你只需要保存班级对象,就可以将该班级信息和该班级下的所有学生在数据库中形成一堆的记录。

而且都不需要你写sql!!!

有木有很神奇。。。。反正宝宝我是惊呆了。

下面就拿具体的代码实现来讲吧~

首先讲一个简单的  单向一对多的案例(以班级和学生作为案例)

众所周知,Hibernate运用的是一种面向对象的思想,我们想要与数据库相关联,首先我们得必须有与之相对应的实体类

比如说,我有一个学生对象和班级对象,分别对应数据库中的学生表和班级表具体信息如下:

Hibernate框架关系映射

  Integer sid;
     String sname;
     String sex;

    .sname =.sex = .sid = .sname = .sex =

Hibernate框架关系映射

 

Hibernate框架关系映射

package entity;/**班级表*/import java.io.Serializable;
import java.util.HashSet;
import java.util.List;
import java.util.Set;public class Grade implements Serializable {    private Integer gid;//班级编号
    private String gname;//班级名称
    private String gdesc;//班级描述
    
    public Grade() {
    }    
    public Grade(String gname, String gdesc) {        this.gname = gname;        this.gdesc = gdesc;
    }    public Integer getGid() {        return gid;
    }    public void setGid(Integer gid) {        this.gid = gid;
    }    public String getGname() {        return gname;
    }    public void setGname(String gname) {        this.gname = gname;
    }    public String getGdesc() {        return gdesc;
    }    public void setGdesc(String gdesc) {        this.gdesc = gdesc;
    }
    
    
}

Hibernate框架关系映射

 

一对多的话,应该是比较好理解的,因为我们可以理解为   一个班级可以以对应多个学生,这就是一对多,既然一个班级对应多个学生的话,那么我们是不是就可以在班级的实体类下载

中加入一个学生集合和呢?这样是不是更能体现出一对多的关系呢?所以我们对班级实体就有了下面的改造下载

Hibernate框架关系映射

package entity;

import java.io.Serializable;
import java.util.HashSet;
import java.util.List;
import java.util.Set;public class Grade implements Serializable {    private Integer gid;//年级编号
    private String gname;//年级名称
    private String gdesc;//年级描述    //添加一个班级里的学生集合
    private Set stus=new HashSet();    public Set getStus() {        return stus;
    }    public void setStus(Set stus) {        this.stus = stus;
    }    public Grade() {
    }    
    public Grade(String gname, String gdesc) {        this.gname = gname;        this.gdesc = gdesc;
    }    public Integer getGid() {        return gid;
    }    public void setGid(Integer gid) {        this.gid = gid;
    }    public String getGname() {        return gname;
    }    public void setGname(String gname) {        this.gname = gname;
    }    public String getGdesc() {        return gdesc;
    }    public void setGdesc(String gdesc) {        this.gdesc = gdesc;
    }
    
    
}

Hibernate框架关系映射

 

实体类写完了,我们就该写最关键的配置文件也就是映射文件了下载(Grade.hbm.xml)

Hibernate框架关系映射





    
    
        
        
            
            
        
        
        
        
        
        
        
            
            
            
        
    

Hibernate框架关系映射

 

这样我们就完成了一对多的配置了,此时,我们不用对Student.hbm.xml做任何操作,下面可以测试了下载

Hibernate框架关系映射

//单向一对多案例(一个班级对应多个学生)
    public static void DOneToManyAdd(){        //准备session 
        Session session=HibernateUtil.currentSession();        //开启事务
        Transaction tx = session.beginTransaction();        //创建一个班级
        Grade grade=new Grade("S1261","无敌的Y1261班");        //准备几个学生
        Student stu1=new Student("微热的雪","女");
        Student stu2=new Student("巴黎的雨季","男");        //设置班级里的学生        grade.getStus().add(stu1);
        grade.getStus().add(stu2);        
        //保存        session.save(grade);
        session.save(stu1);
        session.save(stu2);        
        //提交事务        tx.commit();        //关闭连接        HibernateUtil.closeSession();
    }

Hibernate框架关系映射

 

执行这些代码后可以在控制台看到如下信息

Hibernate框架关系映射

这个时候,你的数据库中便有了如下信息

Hibernate框架关系映射

Hibernate框架关系映射

 

可以从上面的测试代码中看出,我并没有手动的指定学生所在的班级,但是因为有映射文件,Hibernate会自动的检索到所在的班级并自行的发送sql语句到数据库进行持久化操作。

这就是Hibernate的强大之处,当然,这只是一个最简单的例子,下面就跟着我看看更加有趣的例子吧!下载

 

 Hibernate关系映射二之   单向多对一关系映射

多对一关系映射也同样的好理解,比如,多个学生可以同时处于一个班级下,这就是单向的多对一的关系,所以我们就可以想到在学生表中加入一个班级属性

Hibernate框架关系映射

package entity;

import java.io.Serializable;public class Student implements Serializable {    private Integer sid;//学生编号
    private String sname;//学生姓名
    private String sex;//学生性别    //创建一个班级
    private Grade grade;    public Grade getGrade() {        return grade;
    }    public void setGrade(Grade grade) {        this.grade = grade;
    }    public Student() {
    }    
    public Student(String sname, String sex) {        this.sname = sname;        this.sex = sex;
    }    public Integer getSid() {        return sid;
    }    public void setSid(Integer sid) {        this.sid = sid;
    }    public String getSname() {        return sname;
    }    public void setSname(String sname) {        this.sname = sname;
    }    public String getSex() {        return sex;
    }    public void setSex(String sex) {        this.sex = sex;
    }
    
    
}

Hibernate框架关系映射

 

 因为是单向的多对一,所以我们只需要在多的一方,也就是学生方的配置文件中进行修改,班级方的配置文件保持原始(也就是没有set标签的时候)

Hibernate框架关系映射





    
        
            
        
        
        
        
        
    

Hibernate框架关系映射

 

同样,我们做一个单向多对一的添加操作下载

Hibernate框架关系映射

//单向多对一添加案例(多个学生对应一个班级)
    public static void DManyToOneAdd(){        //准备session 
        Session session=HibernateUtil.currentSession();        //开启事务
        Transaction tx = session.beginTransaction();        //创建一个班级
        Grade grade=new Grade("S2222班","挺6的S2222班");        //准备几个学生
        Student stu1=new Student("恩恩","男");
        Student stu2=new Student("呵呵","女");        //设置学生所在的班级        stu1.setGrade(grade);
        stu2.setGrade(grade);        //保存        session.save(grade);
        session.save(stu1);
        session.save(stu2);        //提交事务        tx.commit();        //关闭连接        HibernateUtil.closeSession();
    }

Hibernate框架关系映射

 

注意!!!此时的Hibernate生成的sql语句与一对多时是不一样的!

Hibernate框架关系映射

数据库中同样也是有相对应的记录

 

经过上面两个案例的展示,可能有同学就会有疑问了,既然多个学生可以属于一个班级,一个班级又可以有多个学生,那么他们俩之间到底可以设为 什么关系呢?

此时,我们就可以设置为  双向的一对多的关系了。因为班级和学生是一个双向的关系,而且一个班级又有多个学生

这时我们完整的配置文件就是以上的两个总和了

Student.hbm.xml

Hibernate框架关系映射





    
        
            
        
        
        
        
        
    

Hibernate框架关系映射

 

Grade.hbm.xml

Hibernate框架关系映射





    
    
        
        
            
            
        
        
        
        
        
        
        
            
            
            
        
    

Hibernate框架关系映射

 

测试数据

Hibernate框架关系映射

//双向添加案例
    private static void SAdd(){        //准备session 
        Session session=HibernateUtil.currentSession();        //开启事务
        Transaction tx = session.beginTransaction();        //创建一个班级
        Grade grade=new Grade("S2222班","挺6的S2222班");        //准备几个学生
        Student stu1=new Student("巴黎的雨季","男");
        Student stu2=new Student("微热的雪","女");        //设置班级下的学生        grade.getStus().add(stu1);
        grade.getStus().add(stu2);        //为学生设置班级        stu1.setGrade(grade);
        stu2.setGrade(grade);        //保存        session.save(grade);
            session.save(stu1);
        session.save(stu2);        //提交事务        tx.commit();        
        //关闭连接        HibernateUtil.closeSession();
    }

Hibernate框架关系映射

 

细心的同学会发现,当我执行了上面的代码时,效果与我设置多对一和一对多的效果一样,而且这还比较的繁琐和复杂,所以这并不是双向关系的优势

这里我们就要用到cascade(级联)的属性了   设置级联的属性后,因为有 双向的关系,所以当你只添加班级的时候Hibernate会自动的添加班级下的学生

Student.hbm.xml  下载

 

Hibernate框架关系映射





    
        
            
        
        
        
        
        
    

Hibernate框架关系映射

 

Grade.hbm.xml

Hibernate框架关系映射





    
    
        
        
            
            
        
        
        
        
        
        
        
            
            
            
        
    

Hibernate框架关系映射

 

 这样当我们设置级联的属性后,测试代码如下

Hibernate框架关系映射

//双向添加案例(添加班级自动添加班级下的学生)
    private static void SAdd(){        //准备session 
        Session session=HibernateUtil.currentSession();        //开启事务
        Transaction tx = session.beginTransaction();        //创建一个班级
        Grade grade=new Grade("S2222班","挺6的S2222班");        //准备几个学生
        Student stu1=new Student("巴黎的雨季","男");
        Student stu2=new Student("微热的雪","女");        //设置班级下的学生        grade.getStus().add(stu1);
        grade.getStus().add(stu2);        //为学生设置班级        stu1.setGrade(grade);
        stu2.setGrade(grade);        //保存(设置级联属性,自动关联该班级下的学生)        session.save(grade);    
        
        //提交事务        tx.commit();        
        //关闭连接        HibernateUtil.closeSession();
    }

Hibernate框架关系映射

 

这样,我们只用写save(grade) 保存班级,这时Hibernate会生成如下代码

Hibernate框架关系映射


相关内容

热门资讯

武契奇抵京:这无疑是我政治生涯... 据央视新闻消息,塞尔维亚总统武契奇5月24日至28日对中国进行国事访问。24日中午,武契奇总统乘机抵...
泽连斯基:俄方发射了90枚导弹... 当地时间24日,乌克兰总统泽连斯基通过社交媒体发文表示,自当日凌晨起,乌克兰救援部门及相关应急部门已...
“都到这个关键时刻了,难道还要... 中国应急管理报消息,5月22日19时29分,沁源县山西通洲集团留神峪煤矿发生瓦斯爆炸事故。事故发生后...
分布式电推进协同控制大模型决策... 分布式电推进协同控制大模型决策系统已融合人工智能AI软件平台 北京华盛恒辉分布式电推进协同控制大模型...
PCB制备耗材:PCB湿电子化... 来源:市场资讯 (来源:伏白的交易笔记) 一. PCB电子化学品 PCB制备共涉及数百道工序,核心步...
原创 我... 今天上午时分,一场有关神舟二十三号载人飞行任务的新闻发布会,于酒泉卫星发射中心举行。发言人对外透露,...
沈伯洋质疑蒋万安AI愿景没电,... 海峡导报综合报道 台北选战议题持续交锋,台北市长蒋万安抛出,2035年以前要让台北跻身全球前十大AI...
重庆永川特大暴雨:农家乐经营者... 5月24日上午,据永川发布消息,5月23日23时至24日8时20分许,重庆永川区出现特大暴雨,辖区茶...
巴基斯坦客运列车遭袭现场 5月24日,据巴基斯坦警方消息,该国西南部俾路支省一列客运列车当天遭爆炸袭击,已导致至少24人死亡、...
AI热潮下的公关困境:英国企业... IT之家 5 月 24 日消息,据《卫报》今天报道,各大公关企业表示,英国各大公司如今正在想方设法把...