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

时间: 2024-10-22 23:50:44

hibernate关联关系的相关文章

Hibernate关联关系的CRUD

本文以Group和User(一对多.多对一)双向关联为例,介绍关联关系的CRUD   下面先介绍两个属性 cascade:只影响CRUD中的CUD,即存储(save).更新(update).删除(delete) fetch:只影响CRUD中的R,即读取(get.load)   cascade(级联): 此属性仅仅帮助我们简化编程,不是必选项 如果A和B为单向关联,则在主导方设置cascade属性 如果A和B为双向关联,则在双方都要设置cascade属性 如果两个对象之间有关联关系,比如User和

Hibernate关联关系映射(单向篇)

Hibernate关联关系可分为单向关联和双向关联两大类.单向关联可以分为一对一.一对多.多对一和多对多4种关联方式,而多向关联可以分为一对一.一对多和多对多3种关联方式. Hibernate连接管理类HibernateUtil.java public class HibernateUtil { private static SessionFactory sessionFactory; private static final ThreadLocal<Session> threadLocal

hibernate关联关系映射之配置文件

词汇解释 关系:事物之间相互作用.相互联系的状态.范围最大. 联系:在关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n. 关联:表示对象之间的关系,既有数量性,又有方向性:动词:将对象之间通过某种方式联系起来. 映射:这里指java对象和数据库表的一种对应关系.动词:形成这种对应关系. 级联:有关系的双方中操作一方,另一方也将采取一些动作. 关联的联系种类 在不考虑关联的方向前提下,联系就是关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n. 一对一联系(1:1):如用户和

hibernate 关联关系(多对一、多对多、一对一)的配置

1:多对一 一般关系由多的一方来维护 多的一方需要有一方的字段,一的一方要有多的一方的set集合 一方的配置文件: ClientEntity为一的一方,OrderEntity为多的一方 <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hiberna

Hibernate关联关系映射之一对一关联关系

人和身份证之间就是一个典型的一对一关联关系.实现一对一关联关系映射的方式有两种一种是基于外键,一种是基于主键,下面我们先看基于外键的关联方式 首先看他们的实体类 Person类 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package entity; public class Person {     private Integer id;     private String name;     pr

hibernate关联关系映射

本文将介绍hibernate的几种关联关系映射:多对一.一对一.一对多.多对多. 多对一 以用户和组为例,假设多个用户对应一个组,用户即为多的一端,组即为一的一端. 关键代码和配置: 用户: public class User implements Serializable { private static final long serialVersionUID = 1L; private Long id; private String name; private Group group; pu

Hibernate关联关系配置(一对一,一对多以及多对多)

hihernate一对多关联映射(单向Classes----->Student) 一对多关联映射利用了多对一关联映射原理 多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多 也就是说一对多和多对一的映射策略是一样的,只是站的角度不同 在一一端维护关系的缺点: * 如果将t_student表里的classesid字段设置为非空,则无法保存 * 因为不是在student这一端维护关系,所以student

hibernate关联关系映射详解

词汇解释 关系:事物之间相互作用.相互联系的状态.范围最大. 联系:在关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n. 关联:表示对象之间的关系,既有数量性,又有方向性:动词:将对象之间通过某种方式联系起来. 映射:这里指java对象和数据库表的一种对应关系.动词:形成这种对应关系. 级联:有关系的双方中操作一方,另一方也将采取一些动作. 关联的联系种类 在不考虑关联的方向前提下,联系就是关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n. 一对一联系(1:1):如用户和

Hibernate关联关系配置(一对多、一对一和多对多)

第一种关联关系:一对多(多对一) "一对多"是最普遍的映射关系,简单来讲就如消费者与订单的关系. 一对多:从消费者角的度来说一个消费者可以有多个订单,即为一对多. 多对一:从订单的角度来说多个订单可以对应一个消费者,即为多对一. 一对多关系在hbm文件中的配置信息: 消费者(一方): <?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC