Hibernate中的映射关系(一对多)
在数据库中表和表之间的关系有几种,(一对一,一对多,多对多)
一对一关系:可以选择任意一方插入外键(one-to-one:one-to-one<--->many-to-one[unique='true'])
一对多关系:在多的一端插入一端的主键为外键(one-to-many<--->many-to-one)
多对多关系:新建一个表,选择两个表的主键为表的两个外键(many-to-many<-->many-to-many>)
关系配置步骤:
①:分析1端和n端
②:在1端插入n端的集合属性
③:在n端插入一端的对象属性
④:注明关系在那一段维护
基于xml文件格式配置
I单向一对一(以department和manager为例)
配置步骤:
①:分析1端和n端(如果是一对一关系的时候,可以选择任意一方为N端,这里指定department为n端)
②:在1端插入n端的集合属性(因为是一对一,所以不可以使集合对象属性,只能使用对象属性->private Department department)
③:在n端插入一端的对象属性->private Manager manager
④:注明关系在那一段维护:一般选择N端来维护关系 《使用many-to-one[unique='true']》
步骤:1在一对一关联的持久化类中互相添加对方对象属性,
例如在department中添加private manager manager属性:
department代码如下:
package com.atguigu.hibernate.one2one.foreign;
public class Department {
private Integer deptId;
private String deptName;
private Manager mgr;
public Integer getDeptId() {
return deptId;
}
public void setDeptId(Integer deptId) {
this.deptId = deptId;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public Manager getMgr() {
return mgr;
}
public void setMgr(Manager mgr) {
this.mgr = mgr;
}
}
manager的代码:
package com.atguigu.hibernate.one2one.foreign;
public class Manager {
private Integer mgrId;
private String mgrName;
private Department dept;
public Integer getMgrId() {
return mgrId;
}
public void setMgrId(Integer mgrId) {
this.mgrId = mgrId;
}
public String getMgrName() {
return mgrName;
}
public void setMgrName(String mgrName) {
this.mgrName = mgrName;
}
public Department getDept() {
return dept;
}
public void setDept(Department dept) {
this.dept = dept;
}
}
2对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素。为many-to-one元素且增加unique=“true” 属性来表示为1-1关联
<?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.atguigu.hibernate.one2one.foreign.Department" table="DEPARTMENTS"> <id name="deptId" type="java.lang.Integer">
<column name="DEPT_ID" />
<generator class="native" />
</id> <property name="deptName" type="java.lang.String">
<column name="DEPT_NAME" />
</property> <!-- 使用 many-to-one 的方式来映射 1-1 关联关系,其实many-to-one 就是可以用来生成外键 -->
<many-to-one name="mgr" class="com.atguigu.hibernate.one2one.foreign.Manager" column="MGR_ID" unique="true">
</many-to-one>
</class>
</hibernate-mapping>
另一端需要使用one-to-one元素,该元素使用 property-ref 属性指定使用被关联实体主键以外的字段作为关联字段(就是要指定外键是哪一个,记得是使用Java的属性名,不是使用Sql的列名)
<?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.atguigu.hibernate.one2one.foreign.Manager" table="MANAGERS"> <id name="mgrId" type="java.lang.Integer">
<column name="MGR_ID" />
<generator class="native" />
</id> <property name="mgrName" type="java.lang.String">
<column name="MGR_NAME" />
</property> <!-- 映射 1-1 的关联关系: 在对应的数据表中已经有外键了, 当前持久化类使用 one-to-one 进行映射 -->
<!--
没有外键的一端需要使用one-to-one元素,该元素使用 property-ref 属性指定使用被关联实体主键以外的字段作为关联字段
-->
<one-to-one name="dept" class="com.atguigu.hibernate.one2one.foreign.Department"
property-ref="mgr"></one-to-one> </class> </hibernate-mapping>
对于一对一关联映射,记得千万不要两张表都设置外键,这样会引起逻辑错误的
2下面就详细说一下在Hibernate中怎样映射一对多的关系
根据文章开头的介绍的配置步骤来分析(以order和customer为例子)
1分析那一个是N端(order)
2在一端插入n端的集合属性 -->private set<order> orders
3在N端插入一端的对象属性-->private Customer customer
4在N端指定依赖维护关系:在n端的hbm.xml文件中插入
--<many-to-one name="N端插入一端时的对象属性名" class="对象属性的对象全类名" column="外键名"></many-to-one>
就需要通过那就用到.hbm.xml文件的<many-to-one>标签了
在order.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 package="com.atguigu.hibernate.entities.n21"> <class name="Order" table="ORDERS"> <id name="orderId" type="java.lang.Integer">
<column name="ORDER_ID" />
<generator class="native" />
</id> <property name="orderName" type="java.lang.String">
<column name="ORDER_NAME" />
</property> <!--
映射多对一的关联关系。 使用 many-to-one 来映射多对一的关联关系
name: 多这一端关联的一那一端的属性的名字
class: 一对应的类名
column: 一那一端在多的一端对应的数据表中的外键的名字
-->
<many-to-one name="customer" class="Customer" column="CUSTOMER_ID"></many-to-one> </class>
</hibernate-mapping>
单向多对多:(以teacher和student为例)
根据文章开头的介绍的配置步骤来分析
1分析那一个是N端,---->两者都是N端,所以为n1(teacher)和n2(student)端
2在n1端插入n2端的集合对象属性 -->private set<student> students
3在n2端插入n1端的集合对象属性-->private set<teacher> teachers
4在N端指定依赖关系:因为都是N端,所以多要在n1和n2端指定<set>属性和<many-to-many>属性
n1端:
<set name="students" table="t_s_Connection">
<key>
<column name="T_ID" />
</key>
<many-to-many class="com.atguigu.hibernate.n2n.Student" column="S_ID"/>
</set>
n2端:
<set name="teachers" table="t_s_Connection">
<key>
<column name="S_ID"></column>
</key>
<many-to-many class="com.atguigu.hibernate.n2n.Teacher" column="T_ID" ></many-to-many>
</set>
基于注解方式配置
关系配置步骤:
①:分析1端和n端
②:在1端插入n端的集合属性
③:在n端插入一端的对象属性
④:在被维护的一端插入维护端的属性名
⑤:注明关系在那一段维护
1一对一关系
根据关系配置步骤:(以department和manager为例子)
①:分析1端和n端---因为是一对一关系,所以没有N断,所以指定任意一个为N端,我这里指定department为N端
②:在1端插入n端的集合对象属性---(因为是一对一,所以不是集合)--->private deparment deparment
③:在n端插入一端的对象属性---->private manager manager
④:在被维护的一端插入维护端的属性名@OneToOne(mappedBy="person")
注明关系在那一段维护:-->一般选择自己指定的N端维护,所以在department端加上注解
@OneToOne ---> OnetoOne指定了一对一的关联关系,一对一中随便指定一方来维护映射关系,这里选择IDCard来进行维护
@JoinColumn(name="pid")
Hibernate中的映射关系(一对多)的更多相关文章
- hibernate中一对一映射
一.hibernate中一对一映射有两种 1 主键方式,一张表的主键是通过另一张表的主键生成的 2 外键方式,一张表添加外键引用另一张表的主键,并添加唯一unique约束 二.下面进行简单例子,用户和 ...
- hibernate中的映射
hibernate中的映射是指Java类和数据库表中的属性来进行关联,然后通过类来操作数据库中,这就是简单的映射.
- Hibernate的关联映射关系
一:多对一 <many-to-one 1.name:当前类的属性名(关联映射的类) 2.column:属性多对应的类的对应的表的外键(连接条件) 3.class:属性所对应的类的权限定名 4.n ...
- Hibernate学习之映射关系
一.Hibernate多对一关联映射:就是在“多”的一端加外键,指向“一”的一端. 比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系. 1.“多”端实体加入引用“一”端实体的变量及g ...
- Hibernate框架--关联映射,一对多,多对多 inverse cascade
回顾Hibernate: 1. hibernate开发环境搭建 ----> 引入jar: hibernate.jar + required + jpa + 驱动包 ---> hiberna ...
- hibernate笔记--继承映射关系的三种实现方式
单表继承映射(一张表): 假设我们现在有三个类,关系如下: Person类有两个子类Student和Teacher,并且子类都具有自己独有的属性.这种实体关系在hibernate中可以使用单表的继承映 ...
- 关于hibernate中多对多关系
关于多对多关系 数据库:在使用多对多的关系时,我们能够使用复合主键.也能够不使用,直接引入外键相同能够实现. 在数据库中使用多对多关系时,须要一个中间表. 多对多关系中的数据库结构例如以下: 表:Or ...
- hibernate 中多对多关系对象集合的保存
多对多关系映射和一对多关系映射开发步骤差不多, 例子如下:员工和项目之间的关系,一个员工可以参与多个项目:一个项目可以有多个开发人员参与.因此是多对多的关系. 1 分析数据表 1.1)员工表 CREA ...
- 【转】hibernate中的映射文件xxx.hbm.xml详解总结
一.Hibernate映射文件的作用: Hibernate映射文件是Hibernate与数据库进行持久化的桥梁 二,Hibernate映射文件主要内容: (1).映射内容的定义: Hibern ...
随机推荐
- 基于Vivado的嵌入式开发 ——PS+PL实践
基于Vivado的嵌入式开发 ——PS走起 硬件平台:ZedBoard 开发工具:Vivado 2014.2 1.规划 废话不多说,依然是流水灯,这次是采用PS+PL实现. 功能依旧简单,目标是为了学 ...
- dbrd 8.4.6 源代码编译安装
---------------------------- 0.系统环境 ---------------------------- db01 192.168.50.10 /dev/sdb1 主节点 db ...
- C++ virtual继承
C++ virtual继承的还有一种名称是菱形继承.主要目的是用于解决从不同类继承来的同名数据成员在内存中有不同的拷贝.造成数据不统一的问题,以致于在进行类释放时造成内存泄漏. 将共同的基类作为虚基类 ...
- android.view.animation(3) - LayoutAnimationController 和 GridLayoutAnimationController
前几篇给大家讲述了如何针对某一个控件应用动画,这篇将给大家讲解如何给容器中的控件应用统一动画.即在容器中控件出现时,不必为每个控件添加进入动画,可以在容器中为其添加统一的进入和退出动画. 从上面的示例 ...
- CLoadScene类
#ifndef __LOADSCENE_H__ #define __LOADSCENE_H__ #include "GameFrameHead.h" class CGameScen ...
- Android 资源保护问题——探索
apk文件使用解压工具就能看到drawable等资源,但是有些游戏中的图片资源却是无法看到的. 这个问题探索了许久…… [1]图片资源不放置在drawable文件下,放在assets中(但是解压apk ...
- Java连接postgresql数据库
1.下载驱动jar下载地址:https://jdbc.postgresql.org/download.html 2.导入jar包新建lib文件夹,将下载的jar驱动包拖到文件夹中.将jar驱动包添加到 ...
- nyoj746 整数划分(四)
整数划分(四) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近遇到 ...
- Eclipse “cannot be resolved to a type” error
引言: eclipse新导入的项目经常可以看到"XX cannot be resolved to a type"的报错信息.本文将做以简单总结. 正文: (1)jd ...
- m4--宏处理器
m4 是 POSIX 标准中的一部分,所有版本的 UNIX 下都可用.虽然这种语言可以单独使用,但大多数人需要 m4 仅仅是因为 GNU autoconf 中的 “configure” 脚本依赖它.宏 ...