- 浏览: 124518 次
- 性别:
- 来自: 深圳
文章分类
最新评论
看完多对一,再来看看一对一的情况:
学生和证件是一对一的关系,并且学生ID和证件的ID是相同的。
建表脚本:
create table certificate( id varchar(100) not null default '', `describe` varchar(100) default '', primary key (id) ) create table student( id varchar(100) not null default'', name varchar(20) default'', `cardId` varchar(20) not null default'', age int(11) default'0', primary key(id) )
Student.java
package com.hibernate.model; public class Student { private String id; //标识ID private String cardId;//学号 private String name;//姓名 private int age;//年龄 private Certificate cer;//身份证 private Team team;//班级 public String getId() { return id; } public void setId(String id) { this.id = id; } public String getCardId() { return cardId; } public void setCardId(String cardId) { this.cardId = cardId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Certificate getCer() { return cer; } public void setCer(Certificate cer) { this.cer = cer; } public Team getTeam() { return team; } public void setTeam(Team team) { this.team = team; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
package com.hibernate.model; public class Certificate { private String id; private String describe; private Student stu; public String getId() { return id; } public void setId(String id) { this.id = id; } public Student getStu() { return stu; } public void setStu(Student stu) { this.stu = stu; } public String getDescribe() { return describe; } public void setDescribe(String describe) { this.describe = describe; } }
Student.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.hibernate.model.Student" table="student"> <id name="id" unsaved-value="null"> <generator class="uuid.hex"/><!-- 这表示用hibernate的字符序列生成ID --> </id> <property name="cardId" type="string"/><!-- 没有指定 column,则列名和属性名是一样的 --> <property name="name" type="string"/> <property name="age" type="int"/> <one-to-one name="cer" class="com.hibernate.model.Certificate" fetch="join" cascade="all"> </one-to-one> </class> </hibernate-mapping>
Certificate.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.hibernate.model.Certificate" table="certificate" lazy="true"> <id name="id"> <!-- 下面表示引用Certificate的id引用Student的id --> <generator class="foreign"> <!-- 对应Certificate类的stu属性 --> <param name="property">stu</param> </generator> </id> <!-- 因为describe是mysql的关键字,所以下面要用`号(数字键1旁边的字符)表示 --> <property name="describe" column="`describe`" type="string"/> <one-to-one name="stu" class="com.hibernate.model.Student" fetch="select" constrained="true" cascade="none"> </one-to-one> </class> </hibernate-mapping>
在hibernate.hbm.xml中加上映射
<mapping resource="Student.hbm.xml"></mapping> <mapping resource="Certificate.hbm.xml"></mapping>
测试类
package com.hibernate.util; import org.hibernate.Session; import org.hibernate.Transaction; import com.hibernate.model.Certificate; import com.hibernate.model.Student; public class BM { public static void main(String[] args) { Session session = HibernateUtil.currentSession(); Transaction tx = null; try { tx = session.beginTransaction(); //实例化student Student stu = new Student(); stu.setName("lisi"); stu.setCardId("200202"); stu.setAge(18); //实例化certificate Certificate certificate = new Certificate(); certificate.setDescribe("lisi_certificate"); //设置关联 stu.setCer(certificate); certificate.setStu(stu); //只保存student,certificate会自动保存 session.save(stu); tx.commit(); } catch (Exception e) { e.printStackTrace(); }finally{ HibernateUtil.closeSession(session); } } }
再来看看一对一的另一种情况,即certificate表中添加一个stu_id字段,这个字段用来关联引用Student的id,
这也是在实际开发中用的最多的。
针对这种情况,只需要修改上例中的Certificate.hbm.xml文件,将one-to-one修改成many-to-one,如下所示,其它类不需要修改。
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.hibernate.model.Certificate" table="certificate" lazy="true"> <id name="id"> <generator class="uuid.hex"> </generator> </id> <property name="describe" column="`describe`" type="string"/> <!-- unique表示此字段值唯一,它可将many-to-one改造成one-to-one --> <many-to-one name="stu" class="com.hibernate.model.Student" unique="true" column="stu_id"/> </class> </hibernate-mapping>
Hibernate多对多映射
假设有学生(student)和课程(course)的多对多映射。它们使用一张关联表(student_course)来保存关联关系。
建表脚本
create table course( id varchar(32) not null default'', name varchar(20), primary key(id) ) create table student( id varchar(32) not null default'', cardId varchar(20), name varchar(20), age int(20) ) --学生与课程关联表 create table student_course( student_id varchar(32) not null default'', course_id varchar(32) not null default'' )
Student.java
package com.hibernate.model; import java.util.HashSet; import java.util.Set; public class Student { private String id; //标识ID private String cardId;//学号 private String name;//姓名 private int age; //年龄 private Set courses = new HashSet();//课程 public String getId() { return id; } public void setId(String id) { this.id = id; } public String getCardId() { return cardId; } public void setCardId(String cardId) { this.cardId = cardId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Set getCourses() { return courses; } public void setCourses(Set courses) { this.courses = courses; } }
Course.java
package com.hibernate.model; import java.util.HashSet; import java.util.Set; public class Course { private String id; private String name; private Set students = new HashSet(); public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set getStudents() { return students; } public void setStudents(Set students) { this.students = students; } }
Student.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.hibernate.model.Student" table="student"> <id name="id" unsaved-value="null"> <generator class="uuid.hex"/> </id> <property name="cardId" type="string"/><!-- 没有指定 column,则列名和属性名是一样的 --> <property name="name" type="string"/> <property name="age" type="int"/> <set name="courses" table="student_course" cascade="none" inverse="true"> <!--下面这两个column都是对应关联表中的字段--> <key column="student_id"/> <many-to-many class="com.hibernate.model.Course" column="course_id"/> </set> </class> </hibernate-mapping>
Course.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.hibernate.model.Course" table="course"> <id name="id"> <generator class="uuid.hex"/> </id> <property name="name" type="string"/> <set name="students" table="student_course" cascade="save-update"> <key column="course_id"/> <many-to-many class="com.hibernate.model.Student" column="student_id"/> </set> </class> </hibernate-mapping>
测试类
package com.hibernate.util; import org.hibernate.Session; import org.hibernate.Transaction; import com.hibernate.model.Course; import com.hibernate.model.Student; public class BM { public static void main(String[] args) { saveStudentCourse(); } public static void saveStudentCourse(){ Session session = HibernateUtil.currentSession(); Student student = null; Course course = null; Transaction tx = null; try{ tx = session.beginTransaction(); student = (Student) session.createQuery("from Student s where s.name='hp'").uniqueResult(); course = (Course) session.createQuery("from Course s where s.name='English'").uniqueResult(); student.getCourses().add(course); course.getStudents().add(student); tx.commit(); }catch (Exception e) { e.printStackTrace(); }finally{ HibernateUtil.closeSession(session); } } }
运行后,会自动在Student_Course表中保存关联数据。
发表评论
-
hibernate(7):hibernate事务
2011-09-17 23:20 641悲观锁是 ... -
hibernate(6):Hibernate的检索策略
2011-09-17 19:49 7321 1 ... -
hibernate(5):域对象在持久化层的三种状态
2011-09-17 18:34 9051 ... -
hibernate(3):hibernate映射关系
2011-09-16 00:11 919例:建表脚本 create tabl ... -
hibernate(2):开始Hibernate之旅
2011-09-10 16:28 932本例将使用struts2和hiberante开发,首选将s ... -
hibernate(1):hibernate入门
2011-09-10 12:45 655...
相关推荐
【标题】"Hibernate教程20_关系映射案例三"主要涵盖了在Hibernate框架中如何进行对象关系映射(ORM)的实践,特别是针对复杂关系的处理。在这个教程中,我们可能会学习到以下关键知识点: 1. **关系映射**:...
内容:hibernate001:通过 XML 配置的基本示例 hibernate002:通过注释配置的基本示例 hibernate003:会话方法练习 hibernate004:组件使用示例 hibernate005:单向关系映射示例 hibernate006:双向关系映射示例 ...
本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...
Hibernate对象关系映射一对多 很基础等文档
在本教程中,我们将深入探讨Hibernate中的一个关键概念——关系映射中的组件映射。Hibernate作为Java领域中广泛使用的对象关系映射(ORM)框架,它允许开发人员以面向对象的方式处理数据库操作,极大地简化了数据层...
这个名为“Hibernate映射解析 七种映射关系 后端 - Java”的压缩包文件显然包含了关于Hibernate映射关系的详细讲解。让我们深入探讨一下Hibernate的映射解析及其七种主要的映射关系。 首先,Hibernate通过XML映射...
hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,包含4个说明文档,分别详细解说了hibernate关联映射的关联关系,...
- **定义**: Hibernate 是一款流行的开源对象关系映射(ORM)框架,它简化了数据库与 Java 对象之间的交互过程。 - **版本**: 本书针对 Hibernate 5.0 版本进行了更新和介绍,这是在 Java 社区中广泛使用的最新版本...
4. **XML映射文件**:解释Hibernate的Hibernate Configuration File (hbm.xml)和Entity Mapping File (hbm.xml),它们描述了实体类和数据库表之间的映射关系。 5. **SessionFactory和Session**:描述SessionFactory...
Hibernate4中映射关系图解。
关于Hibernate的基本数据类型与Java中基本数据类型的映射关系
Hibernate 4是该框架的一个版本,它涵盖了关系映射、事务处理、原理、性能优化以及二级缓存的使用与最佳实践。以下知识点详细解释了这些关键概念。 1. 关系映射:在Hibernate框架中,关系映射是指对象与数据库表...
《精通Hibernate:Java对象持久化技术详解》这本书深入剖析了Hibernate这一流行的Java对象关系映射(ORM)框架,旨在帮助开发者全面理解并熟练掌握Hibernate的使用。Hibernate是Java开发中的重要工具,它简化了...
标题“Hibernate映射关系配置:XML方式和注解方式”涉及到的是Java持久层框架Hibernate中的一个重要概念——对象关系映射(ORM)。在这个主题中,我们将探讨如何通过XML映射文件和注解来配置Hibernate实体之间的关系...
Hibernate 是一款强大的开源对象关系映射(ORM)框架,它为Java开发者提供了数据持久化的解决方案,极大地简化了数据库操作。在这个名为“办公自动系统”的案例中,我们可以深入理解Hibernate的核心概念和实际运用。...
Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了Java应用中的数据库操作,使得开发者能够更专注于业务逻辑而不是繁琐的SQL代码。 在Java开发中,持久化是将应用程序中的对象状态保存到持久存储介质...
4. **配置XML映射文件**:如果不使用注解,可以在.hbm.xml文件中定义映射,使用标签来配置一对一关系。 5. **持久化操作**:使用SessionFactory创建Session,通过Session进行CRUD(创建、读取、更新、删除)操作。...
此外,自定义对象的映射是Hibernate映射中的一个重要部分。通过在实体类上使用@Entity注解,并使用@Id注解指定主键字段,可以将一个Java类映射到数据库的一张表。字段则通过@Column注解来指定列名和属性,如长度、...