hibernate入门三之关联映射(一对多和多对一)

提示;本文的操作是在入门一和二上面的

hibernate对映射类型

在开始是学习的时候,我以为一对多和多对一是同样的,后来发现不是这样,比如说班主任和班级里的学生,一个班级可能有多个学生,但是只有一个班主任,学生和班主任的关系是多对一,班主任和学生的关系是一对多,两者之间的区别在于它们的指向性

  • 一对一(one-to-one )
  • 一对多(ont-to-many)
  • 多对一(many-to-one)
  • 多对多(many-to-many)

一对多(ont-to-many)和多对一(many-to-one)最常见和做常用的映射类型

一对多(ont-to-many)

1、创建班级表和学生表,通过外键进行关联(

alter table Students add constraint fk_students_gid foreign key (gid) references grade(gid);

2、创建班级表和学生表的实体类(属性/默认构造器、带参构造器、get和set方法,toString方法)

private int gid;private  String gname;private String gdesc;// 在一方定义一个多方的集合private Set<Students> students = new HashSet<Students>();
//其他。。。略 }
public class Students {

    private int sid;
    private String sname;
    private String gender;
    private Date birthday;
    //private String address;
    private Blob pictur;
    private Address address;

//其他。。。略
}

3、创建Grade.hbm.xml(我的Stuendt.hbm.xml已经配置好了)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.hibernate.entity.Grade" table="grade">
        <id name="gid" column="gid" type="int">
            <generator class="increment"></generator>
        </id>
        <property name="gname" type="java.lang.String">
            <column name="gname"/>
        </property>
        <property name="gdesc" type="java.lang.String">
            <column name="gdesc"/>
        </property>
        <!--单项的一对多的关系-->
        <set name="students" table="Students">
            <!--指定的关联外键列-->
            <key column="gid"></key>
            <one-to-many class="com.hibernate.entity.Students"/>
        </set>

    </class>

</hibernate-mapping>

4、在cfg.xml中配置映射文件路径

<!--指定映射文件的路径-->
    <mapping resource="com/hibernate/entity/Grade.hbm.xml"/>
    <mapping resource="com/hibernate/entity/Students.hbm.xml"/>

5、创建HibernateUtil类

public class HibernadUtil {

    private static SessionFactory sessionFactory;
    private static Session session;

    static {
        StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
        sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();
    }

    //获取SessionFacory
    public static SessionFactory getSessionFacory() {
        return sessionFactory;
    }

    //获取session
    public static Session getSession() {

        return sessionFactory.openSession();
    }

    //关闭session
    public static void closeSession(Session session) {
        if (null != session) {
            session.close();
        }
    }

6、进行测试

public class TestStudentsAndGrade {

    public static void main(String[] args) {
        //add();
        //findStudensByGrade();
        //update();
        deleteStudentsBySid();
    }

    //给表中插入数据
    public static void add() {
        Grade grade = new Grade("道班", "道一");
        Students s = new Students("道一", "男", new Date());
        Students s2 = new Students("阴阳", "男", new Date());
        Students s3 = new Students("三生", "女", new Date());
        System.out.println(grade.getStudents().add(s));
        //如果希望在学生表中添加对应道班级编号,需要在班级中添加学生,建立关联关系
        grade.getStudents().add(s);
        grade.getStudents().add(s2);
        grade.getStudents().add(s3);

        Session session = HibernadUtil.getSession();
        //开启事务
        Transaction transaction = session.beginTransaction();
        session.save(grade);
        session.save(s);
        session.save(s2);
        session.save(s3);
        transaction.commit();
        HibernadUtil.closeSession(session);
    }

    //查询班级中包含的学生
    public static void findStudensByGrade() {
        //获取session
        Session session = HibernadUtil.getSession();
        //获取班级信息
        Grade grade = session.get(Grade.class, 1);
        //输出班级信息
        System.out.println(grade.getGname() + "," + grade.getGdesc());

        //找出班级信息,然后找出班级学生信息
        Set<Students> students = grade.getStudents();
        for (Students stu:students
             ) {
            System.out.println(stu);
        }
    }

    //修改学生信息
    public static void update(){
        Grade grade =new Grade("道","道二");
        Session session = HibernadUtil.getSession();
        Transaction transaction = session.beginTransaction();

        //修改学生所在班级信息(grade班级信息为自增长,别一不小心玩过头了)
        Students students = session.get(Students.class, 2);
        grade.getStudents().add(students);
        session.save(grade);
        transaction.commit();
        HibernadUtil.closeSession(session);
    }

    //从班级中删除学生信息
    public static  void deleteStudentsBySid(){

        Session session = HibernadUtil.getSession();
        Transaction transaction = session.beginTransaction();
        Students students = session.get(Students.class,9);
        session.delete(students);
        transaction.commit();
        HibernadUtil.closeSession(session);

    }

}

7、一对多中的set元素属性

多对一(many-to-one)

原文地址:https://www.cnblogs.com/lindaiyu/p/10994131.html

时间: 2024-09-27 03:54:13

hibernate入门三之关联映射(一对多和多对一)的相关文章

千山万水之Hibernate(六)——关联映射(一对多)

学习Hibernate的过程中,映射是比较重要的一部分,再说其中哪一种映射比较重要(或可以说是比较常用)呢?那一定很多人会想到一对多关联映射.之所以这样说,是因为在生活中很多这样的实例:班级-学生.企业-员工.文件夹-文件.试卷-题目等.至于生活中为什么会遇到这样大量一对多的情况,似乎是哲学方面的事情了,当然大家可以继续思考,而我们今天主要讨论Hibernate中的一对多. 原理分析 我们仍然拿班级.学生之间的关系做例子:一个班级包含多个学生.相应的实体关系图为: 单向关联 由图可知,由于单向的

千山万水之Hibernate(四)——关联映射(多对一)

在上一篇文章(<千山万水之Hibernate(三)--基本映射 >)中,我们介绍了怎样通过Hibernate进行最基本的单实体映射以及Hibernate设计的一些基本原理,本篇文章将介绍关联映射中的多对一映射是如何实现的. 原理分析 我们拿学生和班级为示例,学生属于某一个班级,而且多个学生是有可能属于同一个班级的,相应的实体关系图为: Class的映射文件向上一篇我们介绍到的基本映射文件那样编写便可以,而对于Student实体,我们需要从Student中得出对应班级,而Student与Clas

千山万水之Hibernate(七)——关联映射(多对多)

一直认为通过写SQL语句来处理多对多的情况比较复杂,对表关系必须是理解的非常清楚,在学习了Hibernate中的多对多处理后,想想其实多对多也没什么,只不过多了一张表,如果说多了一张表感觉复杂了,Hibernate中我们完全不用去理会他,直接去操作关联实体就可以了,从这点上看,Hibernate为我们做了很多事,确实功不可没. 在有了Hibernate这个帮手后,今天一起看看我们在Hibernate的基础上进行一些操作. 原理分析 我们拿学生和课程为例子来分析,所谓的多对多关系可以这样理解:一个

hibernate关联映射(一对多)

这篇博客将会给大家带来hibernate的关联映射的学习.在现实生活中,不仅只是一对一的映射关系,更多的是一对多,多对多等. 一对多单项关联映射 这里我以网盘为例,一个用户可以拥有多个文件,及用户和文件之间是一对多的关系. user实体类: public class Users { private int uid; private String uname; //用户上传的所有文件 // one方 可以获取 many方 private Set<UpFile> files = new HashS

Hibernate(三) 之 映射关系

一.概念: 关系:名词,事物之间相互作用.相互联系的状态. 关联:名词:表示对象(数据库表)之间的关系:动词:将对象(数据库表)之间通过某种方式联系起来. 映射:将一种形式转化为另一种形式,包括关系. 级联:动词,有关系的双方中操作一方,另一方也将采取一些动作. 值类型:对象不具备数据库同一性,属于一个实体实例其持久化状态被嵌入到所拥有的实体的表行中,没有标识符. 实体类型:具有数据库标识符. 二.数据库: 1.关系 2.1.1.一对一.一对多.多对多 2.1.2.如何表示? 外键+索引 2.级

hibernate关联映射之一对多&amp;多对一

package loaderman.b_one2Many; import java.util.HashSet; import java.util.Set; public class Dept { private int deptId; private String deptName; // [一对多] 部门对应的多个员工 private Set<Employee> emps = new HashSet<Employee>(); public int getDeptId() { re

千山万水之Hibernate(五)——关联映射(一对一)

知道了多对一关联映射的映射原理,我们再来看一对一关联的情况,一对一分映射有两种实现方案: 一对一主键关联映射 对于其中关联的情况我们又各分为单向.双向两种,而对于一对一,Hibernate采用one-to-one标签进行标识. 原理分析 我们拿人(Person)与身份证件(IdCard)为一对一关联对象的示例,他们的实体关系图为: 采取第一种方案,则Person对应数据库表与IdCard对应数据库表中的主键是一一对应的,不需要添加多余的字段来表示外键.Person关联映射文件中的配置为: <?x

关联查询 一对多,多对一,多对多,自关联

关联查询: 一对一,一对多,多对一,多对多,自关联 仅供参考:(返回值是对象的是一对多,返回值是集合的是多对一) 一对一过于简单,只是两表连查 一对多: 职位entity: DAO .xml文件 给对象赋值使用collection标签 property:属性名 ofType:类型 测试: 多对一 entity: DAO: .xml文件 给集合赋值使用association property:属性名 javaType:类型 测试: 多对多 entity: DAO: .XML文件 测试 自关联 (说

1、Hibernate注解实现对象关联映射并自动生成数据库表

---恢复内容开始--- 前言:本例单独使用Hibernate框架通过Hibernate注解实现年级表和学生表的一对多关联并完成其级联操作 1.年级表 package pojo; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import j