[Hibernate] 一对多|多对一

本文介绍Hibernate框架中如何实现一对多与多对一的关系映射,包括配置步骤及示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一对多

一个grade有多个student,底层实现就为外键关联,在自己赋值外键
而Hibernate框架可以帮我们完成一对多关系

拿着一去找多:知道六年级一班,去找六年级一班的所有学生

配置步骤:
1.在grade[一方]添加一个student<set>或student<list>成员变量
private Set students;
2.在grade[一方]的配置文件(Grade.hbm.xml)配置单向的一对多关联关系

    <!-- 配置一对多关联关系 -->
    <set name="students" table="student">
        <!-- 指定关联的外键列 -->
        <key column="gid"></key>
        <one-to-many class="com.imooc.entity.Student"/>
    </set>

多对一

拿着多去找一:小明是哪个班的?

配置步骤:
1.在student[多方]类中添加一个grade[一方]的引用
private Grade grade;
2.在student[多方]配置文件(Student.hbm.xml)中添加

//班级名称 班级类 外键

表格

  • 班级表
grade
gid
gname
gdesc

* 学生表

student
sid
sname
sex
gid

底层表格创建一样,student有个外键关联grade的grade
sql创建代码:

create table grade
(
    gid int primary key,
    gname varchar(20) not null,
    gdesc varchar(50)
);
create table student
(
    sid int primary key,
    sname varchar(20) not null,
    sex char(2),
    gid int
);
alter table student add constraint fk_student_gid foreign key (gid) references grade(gid);

JavaBean创建

  • 班级
    一个班级对应多个学生,在班级类中添加一个set表示有多个学生(1:n)

    public class Grade implements Serializable{
        private int id;
        private String gname;
        private String desc;
        //在一方定义一个多方的集合
        private Set<Student> students; //一对多个关键,由一到多,单向
        public Grade(){}
        public Grade(int gid, String gname, String gdesc) {
            super();
            this.gid = gid;
            this.gname = gname;
            this.gdesc = gdesc;
        }
        //gid为主键,hibernate自动根据配置时写的策略赋值
        public Grade(String gname, String gdesc) {
            super();
            this.gname = gname;
            this.gdesc = gdesc;
        }
        //省略setter和getter
    }
    
  • 学生
    一个学生对应一个班级,则一个学生类中应创一个grade的引用

    public class Student implements Serializable{
        private int sid;
        private String sname;
        private String sex;
        private Grade grade; //多到一的关键,单向
        //sid为主键,框架自动赋值,在Student.hbm.xml中配置赋值策略
        public Student(String sname,String sex) {
            super();
            this.sname = sanme;
            this.sex = sex;
        }
    }
    

添加问题

有一个学生,要添加到学生表里,但是学生的班级问题(学生表中有gid外键)

    //创建一个班级,有班级则要查询找出班级
    Grade g=new Grade("Java一班", "Java软件开发一班");
    //新的同学
    Student stu1=new Student("张三", "男");
    Student stu2=new Student("穆女神", "女");
    //如果希望在学生表中添加对应的班级编号,需要在班级中添加学生,建立关联关系
    g.getStudents().add(stu1);
    g.getStudents().add(stu2);
    //得到一个会话
    Session session=HibernateUtil.getSession(); //方法打包在HibernateUtil类中
    Transaction tx=session.beginTransaction();  //创建事件
    session.save(g); //保存g,如果原来有的班级就不用,查找出就好
    session.save(stu1);
    session.save(stu2);
    tx.commit(); //提交事件
    HibernateUtil.closeSession(session); //关闭会话

Hibernate工作原理:(主键赋值为增加策略)
1. 找出grade,student中主键的最大值
2. 最大值+1赋值给新添加的grade,student的主键
3. 将student的外键gid赋值

查询班级中的学生 由一找多

底层自己做时:去学生表中搜gid=1,返回集合
hibernate:建立关联关系后,可以方便的从一个对象导航到另一个对象

public static void findStudentsByGrade(){
    //得到会话
    Session session=HibernateUtil.getSession();
    //找出id=1的班级
    Grade grade=(Grade) session.get(Grade.class, 1);
    System.out.println(grade.getGname()+","+grade.getGdesc()); //打印查看
    //直接用类方法获得这个班级的学生
    Set<Student> students=grade.getStudents();
    for(Student stu:students){
        System.out.println(stu.getSname()+","+stu.getSex());
    }
}

更新学生信息 修改学生的班级

public static void update(){
    Grade g=new Grade("Java二班", "Java软件开发二班");

    Session session=HibernateUtil.getSession();
    Transaction tx=session.beginTransaction();
    Student stu=(Student) session.get(Student.class, 1);
    g.getStudents().add(stu); //将student添加到新的班级里
    session.save(g);
    tx.commit();
    HibernateUtil.closeSession(session);
}

删除学生信息

public static void delete(){
    Session session=HibernateUtil.getSession();
    Transaction tx=session.beginTransaction();
    Student stu=(Student) session.get(Student.class, 2);
    session.delete(stu);
    tx.commit();
    HibernateUtil.closeSession(session);
}

Hibernate工具类

集成Hibernate的相关方法,Hibernate版本为4

public class HibernateUtil {
    private static SessionFactory sessionFactory;
    private static Session session;
    //静态方法初始化
    static {
        // 创建Configuration对象,读取hibernate.cfg.xml文件,完成初始化
        Configuration config = new Configuration().configure();
        StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder()
                .applySettings(config.getProperties());
        StandardServiceRegistry ssr=ssrb.build();
        sessionFactory=config.buildSessionFactory(ssr);
    }
    //获取SessionFactory
    public static SessionFactory getSessionFactory(){
        return sessionFactory;
    }
    //获取Session
    public static Session getSession(){
        session=sessionFactory.openSession();
        return session;
    }
    //关闭Session
    public static void closeSession(Session session){
        if(session!=null){
            session.close();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

geodoer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值