Hibernate总结(二)---hibernate中的各种映射
知识的准备:
(参考:汤阳光Hibernate3.6(基础))
一、浅谈javaBean之间的关系
存在的关系:
1.关联(一对一、一对多、多对一、多对多)
2.聚合/组合(最后考虑)
3.继承
所以,映射主要分为关联映射、继承映射、其它映射
二、hibernate映射研究的就是持久化对象那一整流程
通过配置文件来控制映射
三个实体中,只要确定两个,就能得到第三个;
此文,主要是从javaBean+配置---------------自动生成-------------table()
需要自动生成,在开发阶段最好在hibernate.cfg.xml中配
<!-- bean自动生成table -->
<property name="hbm2ddl.auto">create-drop</property>
<!-- 打印sql语句 -->
<property name="show_sql">true</property>
整理思路:
java实体由两部分组成:数据和关系;同理,数据库中的表也一样。
数据部分在不同的系统中,存储大同小异,只需要关系编码问题就OK了
但关系部分,在不同的系统中,有很大的差别;而hibernate就是解决,javaObject与DBTable之间的映射,
那么,我们的明白,在javaObject与DBTable具体对于关系是怎么存储的;
javaObject中数据以对象为基本单位,
主要有两种类型:一对一,对象之间相互通过以对方对象为属性来建立联系;
一对多,建立集合,对象的集合。
Db table中关系是通过主外键来建立联系的
两者之间的映射,就是问题所在
正式研究关系
在hibernate中,要进行object与table之间的转换,对object我们不需要进行任何处理,而仅仅只需要对改变xml的配置文件即可。
而我们研究的重点也就是配置文件如何将不同的关系进行配置。
三、关系配置
1.最基本的配置,(假设对象之间没有任何关系,其它都为默认设置)
参见下面代码
在实体类包目录下建立,如本例
首先:
1)在com.tjcu.domain下建User
public class User {
private int id;
private String name;
private Date birthday;
//必须的
public User() {
}
//get/set略
2)在com.tjcu.domain目录下建立User.hbm.xml文件
<!-- 创建object与table之间的映射 -->
<!-- 第一步,导入包命 -->
<hibernate-mapping package="com.tjcu.domain">
<!-- 第二步,建立class与table之间的映射 -->
<class name="User" table="user"> <!-- 第三步,建立主键映射 ,-->
<id name="id" column="id" >
<!-- 注意了,更具不同的需求,选择不同的主键生成器,参考文档 -->
<generator class="native" /> <!-- "native"一种主键生成器,使用hibernate内置id生成 -->
</id>
<!-- 第四步,将所有的属性都建立映射 -->
<property name="name" column="name" />
<property name="birthday" column="birthday" /> </class>
</hibernate-mapping>
3)在hibernate.cfg.xml文件中添加
<mapping resource="com/tjcu/domain/User.hbm.xml"/>
以上就是一个最基本的配置
其中有一个难点:就是主键的生成方式
{
1.为什么有这样奇葩的主键生成器啊?
因为java中判断同一class而不同的object是通过内存地址来判断的,而table中是以id来判断的。
2.具体的主键生成器
native: 对于 oracle 采用 Sequence 方式,对于MySQL 和 SQL Server 采用identity(自增主键生成机制),native就是将主键的生成工作交由数据库完成,hibernate不管 (很常用)。
identity: 使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中很常用)。
sequence: 调用底层数据库的序列来生成主键,要设定序列名,不然hibernate无法找到。
uuid: 采用128位的uuid算法生成主键,uuid被编码为一个32位16进制数字的字符串。占用空间大(字符串类型)。
hilo: 使用hilo生成策略,要在数据库中建立一张额外的表,默认表名为hibernate_unique_key,默认字段为integer类型,名称是next_hi(比较少用)。
foreign: 使用另外一个相关联的对象的主键。通常和<one-to-one>联合起来使用
我就用过这几个,还有别的,根据不同的需求,来查API;一般没有限制,我都采样native。
}
2.关联配置
单项关联:仅仅建立从Order到Customer的多对一关联,即仅仅在Order类中定义customer属性。或者仅仅建立从Customer到Order的一对多关联,即仅仅在Customer类中定义orders集合。
双项关联:既建立从Order到Customer的多对一关联,又建立从Customer到Order的一对多关联
1)一对多/多对一
many-to-one属性:
*name:设定待映射的持久化类的名字。
*column:设定和持久化类的属性对应的表的外键。
*class:设定持久化类的属性的类型。
*not-null:是否允许为空。
2)一对一
必须的区分主次
对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加 many-to-one 元素。为 many-to-one元素增加 unique=“true” 属性来表示为1-1关联,并用name属性来指定关联属性的属性名
<many-to-one name="depart" column="depart_id" />
另一端需要使用one-to-one元素,该元素使用 property-ref(可以不加) 属性指定使用被关联实体主键以外的字段作为关联字段
<!-- 一对一 -->
<one-to-one name="person" constrained="true" />
3)继承
Hibernate支持三种继承映射策略:
¨ 每个具体类一张表(table per concrete class) 将域模型中的每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑域模型中的继承关系和多态。
¨ 每个类分层结构一张表(table per class hierarchy) 对于继承关系中的子类使用同一个表,这就需要在数据库表中增加额外的区分子类类型的字段。
¨ 每个子类一张表(table per subclass) 域模型中的每个类映射到一个表,通过关系数据模型中的外键来描述表之间的继承关系。这也就相当于按照域模型的结构来建立数据库中的表,并通过外键来建立表之间的继承关系。
比较:
具体实现细节略了……
4)组成关系(Component)映射
组件属性的意思是持久化类的属性既不是基本数据类型,也不是 String 字符串,而是某个组件变量,该组件属性的类型可以是自定义类。
¨ 显然无法直接用 property 映射 name 属性。为了映射组件属性, Hibernate 提供了component 元素。
¨ 每个 component 元素映射一个组件属性,组件属性必须指定该属性的类型,component 元素中的 class 属性用于确定组件的类型。
Hibernate总结(二)---hibernate中的各种映射的更多相关文章
- 深入浅出Hibernate(二)多对一关系映射
学习Hibernate是为了更方便的操作数据库,在数据库中的关系模型中存在多对一的关系,比方下图所看到的的员工和部门之间的关系,那么这样的关系在Hibernate中怎样映射呢?让我用一个小Demo来具 ...
- Hibernate学习二----------hibernate简介
© 版权声明:本文为博主原创文章,转载请注明出处 1.hibernate.cfg.xml常用配置 - hibernate.show_sql:是否把Hibernate运行时的SQL语句输出到控制台,编码 ...
- hibernate多生成一个外键以及映射文件中含有<list-index>标签
(原文地址: http://blog.csdn.net/xiaoxian8023/article/details/15380529) 一.Inverse是hibernate双向关系中的基本概念.inv ...
- Hibernate框架(三)框架中的关系映射
在设计数据库时我们会考虑,表与表之间的关系,例如我们前边经常提到的一对一,一对多,多对多关系,在数据库中我们通过外键,第三张表等来实现这些关系.而Hibernate时间实体类和数据库中的表进行的映射, ...
- Hibernate中的一对一映射关系
Hibernate中的一对一映射关系有两种实现方法(单向一对一,和双向一对一)(一对一关系:例如一个department只能有一个manager) 单向和双向有什么区别呢??例如若是单向一对一,比如在 ...
- Hibernate框架之双向多对多关系映射
昨天跟大家分享了Hibernate中单向的一对多.单向多对一.双向一对多的映射关系,今天跟大家分享下在Hibernate中双向的多对多的映射关系 这次我们以项目和员工举个栗子,因为大家可以想象得到,在 ...
- (Hibernate进阶)Hibernate搭建开发环境+简单实例(二)
hibernate是非常典型的持久层框架,持久化的思想是非常值得我们学习和研究的.这篇博文,我们主要以实例的形式学习Hibernate,不深究Hibernate的思想和原理,否则,一味追求,苦学思想和 ...
- Hibernate基础学习(二)—Hibernate相关API介绍
一.Hibernate的核心接口 所有的Hibernate应用中都会访问Hibernate的5个核心接口. (1)Configuration接口: 配置Hibernate,启动Hi ...
- Hibernate(二)
1.1Hibernate的持久化类状态 1.1.1Hibernate的持久化类状态 持久化类:就是一个实体类和数据库表建立了映射关系. Hibernate为了方便的管理持久化类,将持久化类分成了三种状 ...
随机推荐
- 导航栏控制器和标签栏控制器(UINavigationController和UITabBarController)混用
很多时候,在UI设计方面同时需要使用导航控制器和标签栏控制器,这时,需要掌握如何设计结合使用这两种不同控制器.比如手机QQ,程序有三个标签 栏(分别为消息.联系人.动态),同时在选择某个联系人或者会话 ...
- C# 类型的创建
类 类是最普通的引用类型,最简单的声明如下所示: class YourNameClass { } 更复杂的类可以拥有以下这些选项: 置于关键字class前面的:属性(attributes)与class ...
- 关于nvarchar与varchar的区别
varchar(x), nvarchar(x)这里面的x指的是最大的列宽 如果存储的字符串没达到最大列宽 那么他也只获得对应的列宽的存储空间 并不意味着系统就会给它分配x的空间给它 varch ...
- 【整理】SQLServer查询各种数据库对象(表,索引,视图,图表,存储过程等)
首先明确数据库对象的定义:数据库对象定义数据库内容的结构.它们包含在数据库项目中,数据库项目还可以包含数据生成计划和脚本. 常见的数据库对象包括:表,索引,视图,图表,缺省值,规则,触发器,存储过程, ...
- util 学习
const I = 3.4893589; console.log(Number.parseInt(I)); console.log(Number.parseFloat(I)); console.log ...
- js实现表格
主要方法如下,然后今天学到了js的几个函数知识点. 1.eval()函数: 定义和用法eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 语法eval(string) 其 ...
- Flot chart学习笔记
背景及相关简介 在最近的BS新项目中需要用到绘图数据显示的功能.在进行充足的选择之后决定才去开源的Flot.Flot是一个jQuery绘图库.主要用于简单的绘制图表功能.具有吸引人的渲染外观和互操作的 ...
- Linux下安装QT和OpenGL后QT无法使用OpenGL的解决方法
我的系统为Ubuntu14.04,用apt-get安装了实现了OpenGl的mesa,QT则是用官网下载的run文件来安装的. 好了,现在两个都分别有了,所以要在qt下尝试写OpenGl代码. 之前试 ...
- 字符串经典的hash算法
1 概述 链表查找的时间效率为O(N),二分法为log2N,B+ Tree为log2N,但Hash链表查找的时间效率为O(1). 设计高效算法往往需要使用Hash链表,常数级的查找速度是任何别的算法无 ...
- 一个好用的VC DBGRID[图]
本文示例源代码下载 CGridCtrl_demo19_01.zip为演示CGridCtrl的使用 CGridCtrl_demo19_02.zip演示与CMYODBC的配合使用 一.引言 在用vc开发关 ...