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会自动帮我们在数据库中为表关联外键。

 
原文地址:https://www.cnblogs.com/liaohai/p/6523171.html