zoukankan      html  css  js  c++  java
  • hibernate关联关系

    hibernate是一个强大的ORM框架,为了使用面向对象的方式管理数据库,hibernate提供了4中关系设置:

    1.一对一 (one-to-one)

    2.一对多 (one-to-many)

    3.多对一 (many-to-one)

    4.多对多 (many-to-many)

    5最常用的关系是一对多和多对一

    6.实现方式:

    一对多:在"一方"定义“多方”的集合(set集合)

    多对一: 在“多方”定义“一方”的引用(对象属性),多对一和数据库中的关系类似。

    多对多:同时在双方设置对方集合

    7.双向和单向:单向就是只在一方建立关系,缺点是只能通过一方找到另一方,而无法通过另一方找到一方。双向是在两端都建立关系,这样比较灵活

    使用了hibernatr的关联之后,就可以很方便的使用hibernate多表操作

     
    //下面是就学生和班级来建立起关系,学生和班级是多对一关系,班级和学生是一对多关系。使用双向同时在两方设置关联
     1 package model;
     2 
     3 import java.io.Serializable;
     4 
     5 //多对一
     6 //学生表 n : 1班级表
     7 //在多的一方定义一方引用
     8 public class Student implements Serializable {
     9     private int sid;
    10     private String sname;
    11     private String sex;
    12     private int gid;//班级外键
    13     
    14     //一方的引用
    15     private Grade grade; 
    16     
    17     public Student(){
    18         
    19     }
    20     
    21     public Student(int sid) {
    22         super();
    23         this.sid = sid;
    24     }
    25 
    26     public int getGid() {
    27         return this.getGrade().getGid();
    28     }
    29 
    30     public void setGid(int gid) {
    31         this.gid = gid;
    32     }
    33 
    34     public Grade getGrade() {
    35         return grade;
    36     }
    37 
    38     public void setGrade(Grade grade) {
    39         this.grade = grade;
    40     }
    41     
    42     public Student(String sname, String sex) {
    43         super();
    44         this.sname = sname;
    45         this.sex = sex;
    46     }
    47     
    48     public int getSid() {
    49         return sid;
    50     }
    51     public void setSid(int sid) {
    52         this.sid = sid;
    53     }
    54     public String getSname() {
    55         return sname;
    56     }
    57     public void setSname(String sname) {
    58         this.sname = sname;
    59     }
    60     public String getSex() {
    61         return sex;
    62     }
    63     public void setSex(String sex) {
    64         this.sex = sex;
    65     }
    66 
    67 }

    //实体类建立好之后,可以通过hibernate插件自动生成关系

    1   <!-- 单向多对一配置,在多方关联一方外键 -->
    2         <many-to-one name="grade" class="model.Grade" access="field" fetch="join">
    3             <column name="gid" />
    4         </many-to-one>


    //班级表

     1 package model;
     2 
     3 import java.io.Serializable;
     4 import java.util.Set;
     5 
     6 public class Grade implements Serializable{
     7     private int gid;
     8     private String gname;
     9     private String gdesc;
    10     
    11     private Set<Student> student; //定义学生集合,一对多,在一方定义多方集合
    12     
    13     public Set<Student> getStudent() {
    14         return student;
    15     }
    16 
    17     public void setStudent(Set<Student> student) {
    18         this.student = student;
    19     }
    20 
    21     public Grade(){
    22         
    23     }
    24     
    25     public Grade(int gid, String gname, String gdesc) {
    26         super();
    27         this.gid = gid;
    28         this.gname = gname;
    29         this.gdesc = gdesc;
    30     }
    31 
    32     public Grade(int gid) {
    33         super();
    34         this.gid = gid;
    35     }
    36 
    37     public Grade(String gname, String gdesc) {
    38         super();
    39         this.gname = gname;
    40         this.gdesc = gdesc;
    41     }
    42     
    43     public int getGid() {
    44         return gid;
    45     }
    46     
    47     public void setGid(int gid) {
    48         this.gid = gid;
    49     }
    50     
    51     public String getGname() {
    52         return gname;
    53     }
    54     
    55     public void setGname(String gname) {
    56         this.gname = gname;
    57     }
    58     
    59     public String getGdesc() {
    60         return gdesc;
    61     }
    62     
    63     public void setGdesc(String gdesc) {
    64         this.gdesc = gdesc;
    65     }
    66     
    67 }

    //班级表关系配置

    1  <!-- 配置一对多关系,设置多方集合 -->
    2         <set name="student" inverse="true" cascade="all">
    3            <key column="gid"></key>
    4            <one-to-many class="model.Student"/>
    5         </set>

    //测试类

     1 package test;
     2 
     3 import java.util.Set;
     4 
     5 import org.hibernate.Session;
     6 import org.hibernate.Transaction;
     7 
     8 import util.HibernateUtil;
     9 import model.Grade;
    10 import model.Student;
    11 
    12 public class Test {
    13     public static void main(String[] args) {
    14 //        save();
    15 //        findGradeByStudent(1);
    16         findStudentByGrade(1);
    17     }
    18     
    19     //保存,比较鸡肋,主要用于关联查询,删除等
    20     public static void save(){
    21         Grade grade = new Grade(1);
    22         Student student2 = new Student("廖海2", "男");
    23         
    24         //设置多对一关联关系(外键)
    25         student2.setGrade(grade); 
    26         
    27         //执行操作
    28         Session session = HibernateUtil.getSession();
    29         Transaction tx = session.beginTransaction();//开启事务
    30         session.save(student2);
    31         System.out.println("save is ok!");
    32         tx.commit(); //事务落地
    33         HibernateUtil.closeSession();//关闭连接
    34         
    35     }
    36     
    37     //根据学生id查询出学生所在班级信息
    38     public static void findGradeByStudent(int sid){
    39         //执行操作
    40         Session session = HibernateUtil.getSession();
    41         //查询学生
    42         Student student1 = (Student) session.get(Student.class, new Integer(sid)); //使用Integer封装,类才能序列化,变量不能序列化
    43         System.out.println(student1.getSname());
    44         //输出班级信息
    45         System.out.println(student1.getSid() + student1.getGrade().getGname() + student1.getGrade().getGdesc());
    46         //关闭连接
    47         HibernateUtil.closeSession();
    48     }
    49     
    50     //根据学生班级id,查询出班级中所有学生的信息
    51     public static void findStudentByGrade(int gid){
    52         Session session = HibernateUtil.getSession();
    53         //查询班级
    54         Grade grade = (Grade) session.get(Grade.class, gid);
    55         //查询班级中的学生集合
    56         Set<Student> studentSet = grade.getStudent();
    57         for(Student student : studentSet){
    58             System.out.println("班级id:"  + student.getGid());
    59             System.out.println("学生id:"  + student.getSid());
    60             System.out.println("学生姓名:"  + student.getSname());
    61             System.out.println("学生性别:"  + student.getSex());
    62             System.out.println("=============================");
    63         }
    64         
    65     }    
    66 
    67 }


    //设置好关系之后,运行hibernate,hibernate会自动帮我们在数据库中为表关联外键。

     
  • 相关阅读:
    【知识强化】第五章 中央处理器 5.3 数据通路的功能和基本结构
    【知识强化】第五章 中央处理器 5.5 指令流水线
    【知识强化】第五章 中央处理器 5.4 控制器的功能和工作原理
    【知识强化】第二章 数据的表示和运算 2.4 算术逻辑单元ALU
    【知识强化】第二章 数据的表示和运算 2.3 浮点数的表示与运算
    【知识强化】第五章 中央处理器 5.2 指令执行过程
    【知识强化】第七章 输入/输出系统 7.3 I/O接口
    【知识强化】第七章 输入/输出系统 7.2 外部设备
    【知识强化】第三章 存储系统 3.7 虚拟存储器
    【知识强化】第七章 输入/输出系统 7.1 I/O系统基本概念
  • 原文地址:https://www.cnblogs.com/liaohai/p/6523171.html
Copyright © 2011-2022 走看看