1.N-1映射示例:
假设有两张表,建立主外键关联
员工<--->部门
员工 Domain:
private Integer id;
private String name;
private Department dept;
员工Hibernate配置:
<class name="Student" table="student_db">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native">
<param name="native">id_inc</param>
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="60"></column>
</property>
<!-- conlumn对应外键,name为对象名称 -->
<many-to-one name="dept">
<column name="name_"></column>
</many-to-one>
</class>
部门Domain:
private Integer id;
private String name;
部门hbm
<class name="Department" table="department_db">
<id name="id" type="java.lang.Integer">
<column name="id"/>
<generator class="native">
<param name="native">id_inc</param>
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="60" ></column>
</property>
</class>
Department dept1 = new Department();
Department dept2 = new Department();
dept1.setName("财务");
dept2.setName("后勤");
Student st1 = new Student();
Student st2 = new Student();
st1.setName("风姿");
st2.setName("导师");
st1.setDept(dept1);
st2.setDept(dept1);
session.save(dept1);
session.save(dept2);
session.save(st1);
session.save(st2);
trans.commit();
2.one-to-many映射
当需要查询出一个部门中有多少个学生的情况下需要配置:
Department:
private Set<Student> stu;
public Set<Student> getStu() {
return stu;
}
public void setStu(Set<Student> stu) {
this.stu = stu;
}
相应的hbm.xml文件为:
<!-- 配置onetomany,cascade为级联,要保存一个部门的时候同时加载两个学生 -->
<set name="stu" >
<key column="dept_id"/>
<one-to-many class="Student"/>
</set>
测试:
1.
//查询一个部门中有多少名学生
Department dept1 = (Department) session.get(Department.class, 3);
Set<Student> set = dept1.getStu();
for(Student s:set){
System.out.println("student:"+s.getName());
}
2.
Department department=new Department();
department.setName("业务部门");
Student stu1=new Student();
stu1.setName("顺平");
Student stu2=new Student();
stu2.setName("小明");
Set sets=new HashSet<Student>();
sets.add(stu1);
sets.add(stu2);
department.setStu(sets);
session.save(stu1);
session.save(stu2);
session.save(department);
其中在测试的过程中一直出现一个错误:
org.hibernate.InvalidMappingException: Could not parse mapping document from resource
后来发现hibernate.config.xml中配置了:
<mapping resource="many2one/Student.hbm.xml" />
<mapping resource="many2one/Department.hbm.xml" />
<mapping resource="one2many/Student.hbm.xml" />
<mapping resource="one2many/Department.hbm.xml" />
可能是名称相同互相干扰的原因,去掉不相干的一组后可以正常测试!
3.one-to-one主键一对一关联
案例:一个人对应一个身份证
private Integer id;
private String name;
private Idcard idcard;
private Integer id;
private Date date;
private Person person;
采用手动分配主键策略
<class name="Person" table="person_db">
<id name="id" type="java.lang.Integer">
<column name="id"/>
<generator class="assigned">
<param name="assigned">id_inc</param>
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="60" ></column>
</property>
<one-to-one name="idcard"></one-to-one>
</class>
设置外键,从而是Person中的id与Idcard中id保持一致
class name="Idcard" table="idcard_db">
<id name="id" type="java.lang.Integer">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<property name="date" type="java.util.Date">
<column name="date" not-null="true"></column>
</property>
<one-to-one name="person"/>
</class>
测试:
Person p1=new Person();
p1.setId(1);
p1.setName("jk");
Idcard idCard=new Idcard();
idCard.setDate(new Date());
idCard.setPerson(p1);//表示idCard对象是属于p1这个对象.
session.save(p1);//先保存人
session.save(idCard);
4.one-to-one基于外键
这样设置的话,那么idcard_db表中就会多一个person的id列
<class name="Idcard" table="idcard_db">
<id name="id" type="java.lang.Integer">
<generator class="assigned">
</generator>
</id>
<property name="date" type="java.util.Date">
<column name="date" not-null="true"></column>
</property>
<many-to-one name="person" unique="true"/>
</class>
测试:
Person p1=new Person();
p1.setId(1);
p1.setName("jk");
Idcard idCard=new Idcard();
idCard.setId(1234);
idCard.setDate(new Date());
idCard.setPerson(p1);//表示idCard对象是属于p1这个对象.
session.save(p1);//先保存人
session.save(idCard);
5.many-to-many
这个映射关系一般很难表示,可以拆分为多对一或者一对多,一对一的组合
例如学生与课程之间的关系为多对多关系
可以建立一个学生课程表作为学生表与课程表的中间表
那么这样,学生与学生课程表之间就是一对多关系,课程与学生课程表之间也是一对多关系。
学生Domain设计:
private Integer id;
private String name;
private Set<StuCourse> stuCourse;
学生hbm配置,因为有一个一对多关系,所以要把Set映射到hbm文件中:
<class name="Student" table="student_db">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native">
<param name="native">id_inc</param>
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" not-null="true"></column>
</property>
<set name="stuCourse">
<!-- 用于指定外键 -->
<key column="student_id"></key>
<one-to-many class="StuCourse" />
</set>
</class>
课程Domain,与学生Domain类似:
private Integer id;
private String name;
private Set<StuCourse> stuCourse;
对应的hbm文件:
<class name="Course" table="course_db">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native">
<param name="native">id_inc</param>
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" not-null="true"></column>
</property>
<set name="stuCourse">
<!-- 用于指定外键 -->
<key column="course_id"></key>
<one-to-many class="StuCourse" />
</set>
</class>
学生课程表:
private Integer id;
private Student stu;
private Course course;
private Integer grade;
该表与学生表和课程表关系均为多对一关系,所以配置文件为:
<class name="StuCourse" table="stucourse_db">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native">
<param name="native">id_inc</param>
</generator>
</id>
<property name="grade" type="java.lang.Integer">
<column name="grade" not-null="true"></column>
</property>
<many-to-one name="stu" column="student_id" />
<many-to-one name="course" column="course_id" />
</class>
注意的是,学生课程表中many-to-one中的column作为学生和课程表中外键来使用。
分享到:
相关推荐
OTN 技术之 SDH 信号映射学习笔记 OTN(Optical Transport Network)技术是当前 Optical Transport Network 的主要技术,而 SDH(Synchronous Digital Hierarchy)信号映射是 OTN 技术中的一个重要部分。SDH 信号...
3.iBatis2学习笔记:单表映射 .doc 4.iBatis2学习笔记:SqlMap的配置总结(18条).doc 5.iBatis2学习笔记:入参和返回值的问题.doc 6.iBatis2学习笔记:一对多映射(双向).doc 7.iBatis2学习笔记:多对多映射(双向)...
学习笔记之什么是持久化和对象关系映射ORM技术,什么是所谓的持久化,什么是ORM
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。...Java学习笔记涵盖了这些核心知识点,通过深入学习和实践,你可以逐步掌握Java编程,并应用于实际项目开发中。
根据提供的信息,我们可以总结出这份文档是关于Go语言学习笔记的部分内容,主要涵盖了Go语言的基础概念、语法结构、数据类型以及并发模型等关键知识点。以下是对这些知识点的详细解析: ### Go语言概述 Go(也称作...
本篇笔记主要聚焦于JPA的关联映射,这是JPA中一个重要的概念,用于定义实体之间的关系。 关联映射允许我们将数据库中的表关系映射到Java对象的关联上。在Hibernate中,这些关系通常通过XML配置文件来定义,而在JPA...
这篇学习笔记可能涵盖了MyBatis的基础概念、配置、映射文件、动态SQL以及其实现数据持久化的各种机制。 首先,MyBatis的核心是XML或注解形式的映射文件,它定义了SQL语句、参数和结果映射。在映射文件中,我们可以...
《Go学习笔记-第四版》是由知名编程作者雨痕编写的关于Go语言的教程,旨在帮助读者深入理解和掌握Go语言的各个方面。Go语言,又称Golang,是Google于2009年推出的一种静态类型的、编译型的、并发型且具有垃圾回收...
在这些MyBatis学习笔记中,我们可以期待涵盖以下几个关键知识点: 1. **MyBatis简介**:首先会介绍MyBatis的起源、目标和优点,例如简化数据库操作、提高开发效率、易于维护等。 2. **环境搭建**:包括如何下载...
Go语言学习笔记的知识点涵盖广泛,它从基础的语法到高级的并发编程,再到源码的剖析,全面介绍了Go语言的特点和编程技巧。以下是根据所提供的文件内容提取的知识点: 1. Go语言基础:Go是一种静态类型编程语言,...
SSH学习笔记3主要聚焦于三个Java企业级开发框架——STRUTS、SPRING和HIBERNATE的集成与应用。这三个框架是Java后端开发中非常重要的组件,它们各自负责不同的层面,共同构建了一个强大的MVC(Model-View-Controller...
《Hibernate学习笔记特别详细》 Hibernate,作为一款开源的Object-Relational Mapping(ORM)框架,为Java开发者提供了强大的数据库操作支持。它简化了数据库访问的复杂性,使得开发人员可以像操作对象一样操作...
MyBatis 的精髓在于 SQL 映射文件(例如:iBatis学习笔记中的映射文件),其中定义了 SQL 语句、参数和结果集映射。这些映射可以包含动态 SQL,使得 SQL 语句更加灵活,可以根据传入的参数动态生成不同的 SQL。 4....
django框架学习笔记(源代码及文档) :“django框架学习笔记” :“django学习” 在Python的世界里,Django是一个强大且受欢迎的Web框架,它遵循模型-视图-控制器(MVC)设计模式,用于快速开发高效且可维护的...
### F2812学习笔记知识点详述 #### 一、如何开始DSP的学习 - **基础知识了解**:首先,快速浏览整个书籍,了解DSP的基本概念和技术背景,掌握DSP的总体框架。 - **学习资料的选择**:选择合适的教材或参考资料非常...
机器学习是人工智能的一个分支,...从学习笔记的内容来看,个人对机器学习的入门知识点掌握较为全面,涵盖了从基本概念到技术应用、以及编程实践的多个方面,对于初学者而言,这些知识可以作为入门机器学习的有益参考。
Hibernate学习笔记整理 以下是 Hibernate 框架的详细知识点: Hibernate 介绍 Hibernate 是一个 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到数据库表中。它提供了一个简洁的方式来访问和操作...
你将学习到卷积层、池化层的概念,以及如何利用滤波器和特征映射来提取图像特征。 【递归神经网络(RNN)与LSTM】 RNNs是一种适用于序列数据的网络结构,尤其适合处理时间序列分析和自然语言处理任务。长短期记忆...
华为数通HCIA HCIP学习笔记 HCIA HCIP是华为数通的认证考试,涵盖了网络基础知识、路由交换技术、网络安全、虚拟化技术等方面的知识。下面是根据提供的文件内容所生成的相关知识点: 1. 小米路由器的应用:小米...