- 浏览: 140304 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
aa87963014:
很好,但是update/insert 是否加锁 。加锁对sel ...
数据库锁 -
RobustTm:
我的这种做法也可以添加A和B
但是换成更新就有问题
hibernate入门(十一):级联操作inversin属性 -
RobustTm:
这位仁兄可以提供一对多双向关联完整的代码不?
我碰到了问题,采 ...
hibernate入门(十一):级联操作inversin属性 -
cfeers:
markxing 写道谢谢分享。。。
不客气,呵呵。
struts2.0 struts.xml配置文件详解 -
markxing:
谢谢分享。。。
struts2.0 struts.xml配置文件详解
4.多对多关系映射:
典型实例:一个学生可以有多个老师,同样一个老师可以有多个学生,对此设计如下:
学生studnet表:
column |
id |
name |
teachers |
老师teacher表:
column |
id |
name |
studnets |
在利用学生查到他所有的老师,我们一般会设计中间表,来查找,中间表用来把学生和老师关联,通过此表进行学生和老师之间的交互查找。
中间表teacher_student:
column |
teacher_id |
studnet_id |
|
复合主键 |
在数据库操作中,作以下说明:如果通过老师查找学生,过程:先通过teacher表查找到id,再到teacher_student表中以teacher.id==teacher_student.teacher_id为查询条件来查找studnent_id , 查找到studnet_id后,再以teacher_student.stucent_id==student.id为查询条件来查找所有学生的信息。 同样通过学生查老师,也是类似的过程。
>>步骤一、创建实体类Student、Teacher
Student类内容如下:省略getXXX()、setXXX()方法。
- package com.asm.hibernate.domain;
- import java.util.Set;
- public class Student {
- private int id;
- private String name;
- private Set<Teacher> teachers;
- }
package com.asm.hibernate.domain; import java.util.Set; public class Student { private int id; private String name; private Set<Teacher> teachers; }
Teacher类内容如下:省略getXXX()、setXXX()方法。
- package com.asm.hibernate.domain;
- import java.util.Set;
- public class Teacher {
- private int id;
- private String name;
- private Set<Student> students;
- }
package com.asm.hibernate.domain; import java.util.Set; public class Teacher { private int id; private String name; private Set<Student> students; }
>>步骤二、为两个实体创建配置文件(省略了前面的xml文档声明内容):Student.hbm.xml内容如下:
- <hibernate-mapping
- package="com.asm.hibernate.domain">
- <class name="Student">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"></property>
- <set name="teachers" table="teacher_student">
- <key column="student_id" />
- <many-to-many class="Student" column="teacher_id"/>
- </set>
- </class>
- </hibernate-mapping>
<hibernate-mapping package="com.asm.hibernate.domain"> <class name="Student"> <id name="id"> <generator class="native"/> </id> <property name="name"></property> <set name="teachers" table="teacher_student"> <key column="student_id" /> <many-to-many class="Student" column="teacher_id"/> </set> </class> </hibernate-mapping>
说明:这里重点说明最后的<set>配置:(1)Student中Set类型的属性配置一个<set>元素,其实在前面的一对多中已经出现了<set>元素的配置,我们可以这样认为“凡是要为某个Set类型的属性进行映射配置,都可以用<set>元素来配置”。 <set>中的table属性为关联表的名称。 (2)它的子元素<key>中的column为关联表中以该映射文件所映射的表的主键为外键的字段名称. (3)<many-to-many> coumn属性为关联表中以欲关联类对应表的主键为外键的字段名称。
Teacher.hbm.xml内容如下:
- <hibernate-mapping
- package="com.asm.hibernate.domain">
- <class name="Teacher">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"></property>
- <set name="students" table="teacher_student">
- <key column="teacher_id" />
- <many-to-many class="Student" column="student_id"/>
- </set>
- </class>
- </hibernate-mapping>
<hibernate-mapping package="com.asm.hibernate.domain"> <class name="Teacher"> <id name="id"> <generator class="native"/> </id> <property name="name"></property> <set name="students" table="teacher_student"> <key column="teacher_id" /> <many-to-many class="Student" column="student_id"/> </set> </class> </hibernate-mapping>
由于和Student.hbm.xml是类似的,这里不作说明,这样也就建立起了双向的多对多关联。
要注意他们所依赖的中间表为teacher_student,所以这里的<set>元素中的table属性和teacher映射文件相同,而特别要注意<key>和<many-to-many>中column中属性值的设定。
>>步骤三、在主配置文件中关联实体配置文件:只需要增加如下内容:
<mapping resource="com/asm/hibernate/domain/Teacher.hbm.xml" />
<mapping resource="com/asm/hibernate/domain/Student.hbm.xml" />
>>步骤四、编写测试文件ManyToManyTest.java:省略导入的包。
- package com.asm.hibernate.test;
- public class ManyToManyTest {
- public static void main(String[] args) {
- add();
- }
- static void add() {
- Session s = null;
- Transaction tr = null;
- try {
- s = HibernateUtil.getSession();
- tr = s.beginTransaction();
- Teacher t1 = new Teacher();
- t1.setName("t1Name");
- Teacher t2 = new Teacher();
- t2.setName("t2Name");
- Student s1 = new Student();
- s1.setName("s1Name");
- Student s2 = new Student();
- s2.setName("s2Name");
- // 再增加如下内容进行测试:
- Set<Teacher> ts = new HashSet<Teacher>();
- ts.add(t1);
- ts.add(t2);
- Set<Student> ss = new HashSet<Student>();
- ss.add(s1);
- ss.add(s2);
- t1.setStudents(ss);
- t2.setStudents(ss);
- // s1.setTeachers(ts);
- // s2.setTeachers(ts);
- // 增加内容完
- s.save(s1);
- s.save(s2);
- s.save(t1);
- s.save(t2);
- tr.commit();
- } finally {
- if (s != null)
- s.close();
- }
- }
- }
package com.asm.hibernate.test; public class ManyToManyTest { public static void main(String[] args) { add(); } static void add() { Session s = null; Transaction tr = null; try { s = HibernateUtil.getSession(); tr = s.beginTransaction(); Teacher t1 = new Teacher(); t1.setName("t1Name"); Teacher t2 = new Teacher(); t2.setName("t2Name"); Student s1 = new Student(); s1.setName("s1Name"); Student s2 = new Student(); s2.setName("s2Name"); // 再增加如下内容进行测试: Set<Teacher> ts = new HashSet<Teacher>(); ts.add(t1); ts.add(t2); Set<Student> ss = new HashSet<Student>(); ss.add(s1); ss.add(s2); t1.setStudents(ss); t2.setStudents(ss); // s1.setTeachers(ts); // s2.setTeachers(ts); // 增加内容完 s.save(s1); s.save(s2); s.save(t1); s.save(t2); tr.commit(); } finally { if (s != null) s.close(); } } }
说明:注意以上注释掉的内容,如果去掉会出现异常。理解:加上增加的内容后再执行发现,在开启“数据库显示”功能后,发现控制台中新增加了四条插入语句,且是插入到中间表teacher_student中,在此处相当于告诉了每个学生所关联到的老师,而如果在mysql客户端执行“show create table teacher_student”,观察它的表结构并结合“去掉注释的报错说明”,就容易理解到为什么不能有注释掉的内容。另需要说明的是“多对多”在操作和性能方面都不太理想,所以它使用较少,一般我们会选择转换成“一对多”的模型,而Hiberante的“多对多”实现,可能也是转换成两个“一对多”来实现.
发表评论
-
hibernate.cfg.xml文件详解(annotation 配置)
2010-08-26 15:57 1561一、 环境搭建和基本映 ... -
hibernate.cfg.xml文件详解
2010-08-26 15:56 742<?xml version='1.0' encoding ... -
hiberante入门(十七):简要总结及源码文档
2010-08-26 11:28 693十三、总结: 1.主配置与实体(映射)配置: 关于这些配置 ... -
hiberante入门(十六):一些细节理论
2010-08-26 11:26 746十二、一些细节问题分 ... -
hiberante入门(十五):事务相关-悲观乐观锁
2010-08-26 11:25 11641.事务引发的三层架构MV ... -
hiberante入门(十四):缓存2
2010-08-26 11:24 426>>步骤四、测试二 ... -
hiberante入门(十四):缓存1
2010-08-26 11:10 7611.模拟缓存并简要说明缓存实现原理 在myhibernate ... -
hiberante入门(十三):懒加载
2010-08-26 11:07 9274.懒加载: 在前面我们已经对懒加载有所提及,现在再借助一个 ... -
hiberante入门(十二):继承关系2
2010-08-26 11:03 963上接hiberante入门(十二 ... -
hiberante入门(十二):继承关系1
2010-08-26 11:01 8253.继承关系: 在前面的部门员工实例中,我们设定的员工只是普 ... -
hibernate入门(十一):级联操作inversin属性
2010-08-26 10:56 1501九、关联关系中的高级应用 1.级联操作: 在前面的一对多 ... -
hiberante入门(十):其它集合类型
2010-08-26 10:53 762八、其它集合类型 说明:在前面我们已经使用过set集合类型, ... -
hibernate入门(九):组件关系映射
2010-08-26 10:51 7735.组件关系映射: 典型实例:每个人有不同的名字,或者多个人 ... -
hibernate入门(七):一对一
2010-08-26 10:42 7223.一对一关系映射: 典型的实例:一个人有一个身份证,而一个 ... -
hibernate入门(六):一对多
2010-08-26 10:36 6892.一对多关系映射: 上面提到的多个员工对应于一个部门,是多 ... -
hibernate入门(五):多对一
2010-08-26 10:32 6431.多对一关系映射: 一个部门有可以有多个员工,而一个员工只 ... -
hibernate入门(四):HQL QBC初步
2010-08-26 10:22 909四 完善工具类及HQL QBC ... -
hibernate入门(三):对象的三种状态
2010-08-26 10:20 687三 Session中的主要方法 ... -
hibernate入门(二):优化代码
2010-08-26 10:17 765二 优化代码 1.为会么要优化 在前面我们已经知道,获取S ... -
hibernate入门(一):第一个应用实例
2010-08-26 10:15 877一 第一个应用实例 1.搭建环境:新建一个名为Hiberna ...
相关推荐
"Hibernate入门到精通" Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 ...
标题"hibernate入门一:单表操作(单对象操作)"表明这篇文章主要介绍的是Hibernate框架的基础使用,特别是针对数据库单表的简单操作,如增删改查,以及如何处理单个数据库对象。描述部分为空,但通常这样的教程会...
本压缩包提供的是Hibernate入门所需的jar包,包括了Hibernate的核心库以及与之配合使用的相关组件。让我们深入探讨一下这些jar包以及它们在Hibernate中的作用。 1. Hibernate核心库: - `hibernate-core.jar`:这...
【Hibernate入门案例源码】是针对初学者设计的一份教程,旨在帮助理解并掌握Java持久化框架Hibernate的基础应用。Hibernate是一个强大的ORM(对象关系映射)框架,它简化了数据库与Java对象之间的交互,使开发者可以...
**初学Hibernate,Hibernate入门** ...随着对Hibernate的深入学习,你会发现它还支持更高级的功能,如级联操作、多对一、一对多等复杂关系映射、缓存机制、延迟加载等,这些都将极大地提升你的开发效率。
hibernate 入门:10分钟跑起这个hibernate 示例程序 (图解、附源码http://download.csdn.net/source/650851)
【hibernate入门小例子】是一个适合初学者的教程,主要涵盖了如何在JavaWeb项目中使用Hibernate框架与MySQL数据库进行集成。在这个例子中,我们将会深入理解Hibernate的核心概念,包括实体映射、对象关系映射(ORM)...
本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...
**Hibernate入门** Hibernate是一款强大的Java持久化框架,它简化了数据库与Java对象之间的交互,使得开发者无需编写大量的SQL语句,就能实现数据的增删改查。本教程将分为五个部分,逐步深入Hibernate的世界。 **...
### Hibernate入门知识点详解 #### Hibernate概述与ORM思想 - **定义**:Hibernate是一个开源的、轻量级的对象关系映射(Object-Relational Mapping,简称ORM)框架,它主要应用于JavaEE架构中的DAO(Data Access ...
Hibernate 支持多种对象关系映射,如一对一、一对多、多对一、多对多。例如,一个User可以有多个Order: ```xml <!-- User.hbm.xml --> <!-- Order.hbm.xml --> ``` 以上就是Hibernate入门的基础内容。...
【hibernate入门--第一个实例】 Hibernate 是一个强大的对象关系映射(ORM)框架,它为Java开发者提供了方便的数据持久化服务。通过使用Hibernate,我们可以将数据库操作转换为对Java对象的操作,从而简化了数据库...
最后,书中可能会涵盖一些高级主题,如多对一、一对多、多对多的关系映射,以及继承映射、复合组件、查询优化等。这些内容都是Hibernate深入学习的重点,对于理解和掌握复杂的数据模型以及高效的数据操作至关重要。 ...
标题“Hibernate基础和入门:新建表和插入表”表明这篇内容将主要围绕Hibernate这一Java持久化框架的基础知识展开,重点讲解如何使用Hibernate创建数据库表以及进行数据插入操作。Hibernate是一个强大的ORM(对象...
### Hibernate入门教程知识点详解 #### 一、Hibernate框架简介 **Hibernate** 是一款开放源代码的**对象关系映射(Object-Relational Mapping,简称ORM)**框架,它为Java应用提供了一种高效的机制,用于处理Java...
15. **实体关系映射策略**:包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)、多对多(ManyToMany)等,理解这些关系并正确配置是使用Hibernate的关键。 通过这个"hibernate_first"实例,你可以...
在这个“hibernate学习入门之一对多实体映射源码”教程中,我们将深入探讨如何在Hibernate中设置和管理一对多的关系。 一、Hibernate简介 Hibernate是Java开发人员用于处理数据库操作的强大工具,通过它,我们可以...