hibernate关系映射(多对一)

对多一关系是最普遍也是最重要的一种对象关系,其中又包括了单向的多对一,单向的一对多以及双向的多对一关系

单向多对一

多的一方:学生(Student)

一的一方:班级(Grade)

班级类的定义以及hbm文件配置如下

1 public class Grade {
2     private int id;
3     private String name;
4 }
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping >
 6     <class name="com.zlt.hibernatedemo.Grade" table="grade">
 7         <id name="id" column="id">
 8             <generator class="increment"></generator>
 9         </id>
10
11         <property name="name" column="name"></property>
12     </class>
13
14 </hibernate-mapping> 

学生类的定义以及hbm文件配置如下

1 public class Student {
2     private int id;
3     private String name;
4     private Grade grade;
5 }
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping >
 6     <class name="com.zlt.hibernatedemo.Student" table="student">
 7         <id name="id" column="id">
 8             <generator class="increment"></generator>
 9         </id>
10
11         <property name="name" type="java.lang.String">
12             <column name="name" length="50" />
13         </property>
14
15         <many-to-one name="grade" column="gradeid"></many-to-one>
16     </class>
17
18 </hibernate-mapping>

测试程序

 1 public class HibernateTest {
 2     public static void main(String[] args) {
 3         Session session = HibernateFactory.currentSession();
 4         Transaction tx = session.beginTransaction();
 5
 6         Grade grade = new Grade();
 7         grade.setName("grade1");
 8
 9         Student student1 = new Student();
10         student1.setName("student1");
11         student1.setGrade(grade);
12
13         Student student2 = new Student();
14         student2.setName("student2");
15         student2.setGrade(grade);
16
17         session.save(grade);
18         session.save(student1);
19         session.save(student2);
20
21         tx.commit();
22         session.close();
23     }
24 }

结果

单向一对多

多的一方:学生(Student)

一的一方:班级(Grade)

学生类的定义以及hbm文件配置如下

1 public class Student {
2     private int id;
3     private String name;
4 }
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping >
 6     <class name="com.zlt.hibernatedemo.Student" table="student">
 7         <id name="id" column="id">
 8             <generator class="increment"></generator>
 9         </id>
10
11         <property name="name"></property>
12     </class>
13
14 </hibernate-mapping>

班级类的定义以及hbm文件配置如下

1 public class Grade {
2     private int id;
3     private String name;
4     private Set<Student> students = new HashSet<Student>();
5 }
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping >
 6     <class name="com.zlt.hibernatedemo.Grade" table="grade">
 7         <id name="id" column="id">
 8             <generator class="increment"></generator>
 9         </id>
10
11         <property name="name" column="name"></property>
12         <set name="students">
13             <key column="grade_id"/>
14             <one-to-many class="com.zlt.hibernatedemo.Student"/>
15         </set>
16     </class>
17
18 </hibernate-mapping>

测试程序

 1 public class HibernateTest {
 2     public static void main(String[] args) {
 3         Session session = HibernateFactory.currentSession();
 4         Transaction tx = session.beginTransaction();
 5
 6         Grade grade = new Grade();
 7         grade.setName("grade1");
 8
 9         Student student1 = new Student();
10         student1.setName("student1");
11
12         Student student2 = new Student();
13         student2.setName("student2");
14
15         grade.getStudents().add(student1);
16         grade.getStudents().add(student2);
17
18         session.save(grade);
19         session.save(student1);
20         session.save(student2);
21
22         tx.commit();
23         session.close();
24     }
25 } 

结果

<set>标签中可以设置cascade属性(all,save-update,delete,none)

当不设置cascade时,保存时需要执行三条语句

1 session.save(grade);
2 session.save(student1);
3 session.save(student2);

当设置cascade="all"后对某个grade的操作会级联到它student,所以只需执行session.save(grade)就可以同时插入三条数据到数据库

不设置cascade时,执行session.delete(grade);会把grade从数据库中删去,同时把student关联到这个grade的外键gradeid的值置为空;而设置了cascade后,删除了grade同时会把该grade对应的student对象从数据库中删去

<set>标签中也可以设置inverse属性(true,false)

inverse="false"(默认)生成的sql语句

Hibernate: insert into grade (name, id) values (?, ?)

Hibernate: insert into student (name, id) values (?, ?)

Hibernate: insert into student (name, id) values (?, ?)

Hibernate: update student set grade_id=? where id=?

Hibernate: update student set grade_id=? where id=?

inverse="true"生成的sql语句

Hibernate: insert into grade (name, id) values (?, ?)

Hibernate: insert into student (name, id) values (?, ?)

Hibernate: insert into student (name, id) values (?, ?)

同时数据库并没有关联三条数据

它意味着 grade不再作为主控方,而将关联关系的维护工作交给关联对象student来完成。在保存grade时,grade不在关心student的gradeid属性,必须由student自己去维护,即设置student.setGrade(grade); 如果需要通过student来维护关联关系,那么这个关联关系转换成双向关联。

双向关联

学生

1 public class Student {
2     private int id;
3     private String name;
4     private Grade grade;
5 }
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping >
 6     <class name="com.zlt.hibernatedemo.Student" table="student">
 7         <id name="id" column="id">
 8             <generator class="increment"></generator>
 9         </id>
10
11         <property name="name" type="java.lang.String">
12             <column name="name" length="50" />
13         </property>
14
15         <many-to-one name="grade" column="gradeid"></many-to-one>
16     </class>
17
18 </hibernate-mapping> 

班级

1 public class Grade {
2     private int id;
3     private String name;
4     private Set<Student> students = new HashSet<Student>();
5 }
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping >
 6     <class name="com.zlt.hibernatedemo.Grade" table="grade">
 7         <id name="id" column="id">
 8             <generator class="increment"></generator>
 9         </id>
10
11         <property name="name" column="name"></property>
12
13         <set name="students" inverse="true" cascade="all">
14             <key column="gradeid"/>
15             <one-to-many class="com.zlt.hibernatedemo.Student"/>
16         </set>
17     </class>
18
19 </hibernate-mapping>

测试程序

public class HibernateTest {
    public static void main(String[] args) {
        Session session = HibernateFactory.currentSession();
        Transaction tx = session.beginTransaction();

        Grade grade = new Grade();
        grade.setName("grade1");

        Student student1 = new Student();
        student1.setName("student1");

        Student student2 = new Student();
        student2.setName("student2");

        //只需要session.save(grade);就能插入三条数据,需要先设置cascade
        grade.getStudents().add(student1);
        grade.getStudents().add(student2);

        //因为grade中inverse设置为ture,所以需要由student维护关联关系,设置graidid
        student1.setGrade(grade);
        student2.setGrade(grade);

        session.save(grade);
        tx.commit();
        session.close();

    }
}

结果:

产生3条sql语句(如果用一的那端维护关联关系,会产生5条sql,所以在多的一方设置inverse="true",有助于性能的改善)

Hibernate: insert into grade (name, id) values (?, ?)

Hibernate: insert into student (name, gradeid, id) values (?, ?, ?)

Hibernate: insert into student (name, gradeid, id) values (?, ?, ?)

自身一对多配置

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 3
 4     <hibernate-mapping>
 5         <class name="Category" table="category">
 6             <id name="id" type="string">
 7                 <column name="id"></column>
 8                 <generator class="uuid"></generator>
 9             </id>
10
11             <property name="name" column="name" type="string"></property>
12
13             <set name="chidrenCategories" cascade="all" inverse="true">
14                 <key column="category_id"></key>
15                 <one-to-many class=" Category"/>
16             </set>
17
18             <many-to-one name="parentCategory"  column="category_id"></many-to-one>
19
20         </class>
21     </hibernate-mapping>

hibernate关系映射(多对一)

时间: 2024-08-09 02:08:03

hibernate关系映射(多对一)的相关文章

hibernate关系映射(多对多)

多对多关系(学生Student,课程Course) 学生类的定义以及hbm文件的配置如下 1 public class Student { 2 private int id; 3 private String name; 4 private Set<Course> courses = new HashSet<Course>(); 5 } 1 <?xml version="1.0" encoding="UTF-8"?> 2 <

Java学习笔记-Hibernate关系映射

1. 初识Hibernate——关系映射 http://blog.csdn.net/laner0515/article/details/12905711 2. Hibernate 笔记8 关系映射1(多对一,一对多): http://www.cnblogs.com/zilong882008/archive/2011/11/05/2236559.html 3. Hibernate关联映射 http://www.cnblogs.com/huxi/archive/2009/12/15/1624988.

hibernate 关系映射文件配置

<!--Department.hbm.xml users属性,本类与User的一对多 --> <set name="users"> <key column="departmentId"></key> <one-to-many class="User" /> </set> <!-- parent属性,本类与Department(上级)的多对一 --> <man

浅谈Hibernate关系映射(3)

继上篇博客 一对多关联映射(单向) 上面我们介绍了多对一,我们反过来看一对多不就是多对一吗?那还用再进行不同的映射吗?有什么差别吗?一对多和多对一映射原理是一致的,存储是相同的,也就是生成的数据库的表是一样的,他们之间不同的是维护的关系不同. 他们之间不同点是维护的关系不同 *多对一维护的关系是:多指向一的关系,有了此关系,加载多的时候可以将一加载上来. *一对多维护的关系是:一指向多的关系,有了此关系,在加载一的时候可以将多加载上来. 一个班级有多个学生,通过班级可以看到学生信息. Class

浅谈Hibernate关系映射(2)

继上篇博客 一对一关系映射:一对一关联映射在实际生活中是比较常见的,如人与身份证的关系,通过人这个对象可以找到他相关的内容. 一对一单向(主键): 单向一对一主键关联,靠的是它们的主键相等,从Person中能看到IdCard,也就是把t_idCard中的主键拿过来当做t_Pseron的主键. 如图的线表示一个关联,在person中可以看见idcard.即在person中持有idCard的引用 person类的映射关系 <hibernate-mapping> <class name=&qu

浅谈Hibernate关系映射(4)

继上篇博客 多对多关联映射(单向) 多对多对象关系映射,需要加入一张新表完成基本映射. Hibernate会自动生成中间表 Hibernate使用many-to-many标签来表示多对多的关联,多对多的关联映射,在实体类中,跟一对多一样,也是用集合来表示的. 如下图所示 通过User可以查看Role的信息 User的映射文件 <hibernate-mapping> <class name="com.bjpowernode.hibernate.User"> <

hibernate关系映射(一对一)

一对一关联分为外键关联和主键关联:外键关联是指从表中存在主表的外键,这也是一种特殊的多对一关系:主键关联是指主从表的id一致 外键关联 主表:IDCard(校园卡) 从表:Student(学生) 学生类的定义和hbm文件的配置如下 1 public class Student { 2 private int id; 3 private String name; 4 //持有idcard的外键 5 private IDCard idCard; 6 }  可以看到 学生持有校园卡外键的类结构和之前多

Hibernate关系映射基础

1.  Hibernate关系映射基础 1.1.  Doctype <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 指定根元素和dtd文件的命名空间. 1.2.  hibernate-mapping <hiberna

Hibernate关系映射之many-to-many(多对多)

软件152 刘安民 在表设计中,我们一般都会考虑表与表之间的关系,现在我来介绍一下表与表之间的几种对应关系many-to-many 多对多 比如一个用户可以有多种角色 一种角色可以对用多个不同的用户所以角色和用户之间的关系是多对多的关系 一般要用第三张表表示两者对应的关系one-to-many 一对多 比如一个老师可以对应很多个学生many-to-one 相反的是多对一 one-to-one 一对一 比如公民和身份证就是一一对应的 Demo实验:学生与课程之间的关系 1.创建StuCourse类