Hibernate4.x之映射文件

POJO类和数据库的映射文件*.hbm.xml
  POJO类和关系数据库之间的映射可以用一个XML文档来定义
  通过POJO类的数据库映射文件,Hibernate可以理解持久化类和数据库表之间的对应关系,也可以理解持久化类属性与数据库表列之间的对应关系
  在运行时Hibernate将根据这个映射文件来生成各种SQL语句
  映射文件的扩展名为.hbm.xml

映射文件说明
  hibernate-mapping
  -类层次:class
    主键:id
    基本类型:property
    实体引用类:many-to-one | one-to-one
    集合:set | list | map | array
    - one-to-many
    - many-to-many
    子类:subclass | joined-subclass
    其它:component | any等
  -查询语句:query(用来放置查询语句,便于对数据库查询的统一管理和优化)

每个Hibernate-mapping中可以同时定义多个类。但更为推荐为每个类都创建一个单独的映射文件

映射对象标识符

  Hibernate使用对象标识符(OID)来建立内存中的对象和数据库表中记录的对应关系。对象的OID和数据表的主键对应。Hibernate通过标识符生成器来为主键赋值
  Hibernate推荐在数据表中使用代理主键,即不具备业务含义的字段。代理主键通常为整数类型,因为整数类型比字符串类型要节省更多的数据库空间
  在对象-关系映射文件中,<id>元素用来设置对象标识符。<generator>子元素用来设定标示符生成器
  Hibernate提供了标识符生成器接口:IdentifierGenerator,并提供了各种内置实现

主键生成策略generator
Hibernate提供的内置标识符生成器
---------------------------------------------------------------------------------------------

increment:适用于代理主键,有Hibernate自动以递增的方式生成
identity:适用于代理主键,有底层数据库生成标识符
sequence:适用于代理主键,Hibernate根据底层数据库的序列生成标识符,这要求数据库支持序列
hilo:适用于代理主键,Hibernate分局high/low算法生成标识符
seqhilo:适用于代理主键,使用一个高/低位算法来高效的生成long,short或int类型的标识符
native:适用于代理主键,根据底层数据库对自动生成标识符的方法,自动选择identity、sequence或hilo
uuid-hex:适用于代理主键,Hibernate采用采用120为的UUID算法生成标识符
uuid-string:适用于代理主键,UUID被编码成一个16字符长的字符串
assigned:适用于自然主键,由Java应用程序负责生成标识符
foreign:适用于代理主键,使用另外一个相关联的对象的标识符
---------------------------------------------------------------------------------------------
increment标识符生成器
  increment标识符生成器由Hibernate以递增的方式为代理主键赋值
  Hibernate会先读取NEWS表中的主键的最大值,而接下来向NEWS表中插入记录时,就在max(id)的基础上递增,增量为1
  

  适用范围:
    由于increment生成标识符机制不依赖与底层数据库系统,因此它适用于所有的数据库系统
    适用于只有单个Hibernate应用进程访问同一个数据库的场合,在集群环境下不推荐使用它
    OID必须为long、int或short类型,如果把OID定位byte类型,在运行时会抛出异常

identity标识符生成器
  identity标示符生成器有底层数据库来负责生成标识符,它要求底层数据库把主键定义为自动增长字段类型
  

  适用范围:
    由于identity生成标识符的机制依赖于底层数据库系统,因此,要求底层数据库系统必须支持自动增加字段类型。支持自动增长字段类型的数据库包括:DB2、MySQL、MS SQL SERVER、Sybase等
    OID必须为long、int或short类型,如果把OID定位byte类型,在运行时会抛出异常

sequence标识符生成器
  sequence标识符生成器利用底层数据库提供的序列来生成标识符
  

1 <id name="id">
2     <generator class="sequence">
3         <param name="sequence">news_seq</param>
4     </generator>
5 </id>    

  Hibernate在持久化一个News对象时,先从底层数据库的news_seq序列中获得一个唯一的标识号,再把它作为主键值
  适用范围:
    由于sequence生成标识符的机制依赖于底层数据库的序列,因此,要求底层数据库必须支持序列,支持序列的数据库包括:DB2、Oracle等
    OID必须为long、int或short类型,如果把OID定义为byte类型,在运行时会抛出异常

hilo标识符生成器
hilo标识符生成器由Hibernate按照一种high/low算法生成标识符,它从数据库的特定表的字段获取中high值

1 <id name="id">
2     <generator class="hilo">
3         <param name="table">HI_TABLE</param>
4     <param name="column">NEXT_VALUE</param>
5     <param name="max_lo">10</param>
6     </generator>
7 </id>

  Hibernate在持久化一个News对象时,有Hibernate负责生成主键值。hilo标识符生成器在生成标识符时,需要读取并修改HI_TABLE表中的NEXT_VALUE值
  适用范围:
    由于hilo生成标识符机制不依赖与底层数据库系统,因此它适合所有的数据库系统
    OID必须为long、int或short类型,如果把OID定义为byte类型,在运行时会抛出异常

native标识符生成器
  native标识符生成器依据底层数据库对自动生成标识符的支持能力,来选择使用identity、sequence或hilo标识符生成器
  适用范围:
    由于native能根据底层数据库系统的类型,自动选择合适的标识符生成器,因此很适合于跨数据库平台开发
    OID必须为long、int或short类型,如果把OID定义为byte类型,在运行时会抛出异常

-----------------------------------
Java时间和日期类型的Hibernate映射
在Java中,代表时间和日期的类型包括:java.util.Date和java.util.Calendar。此外,在JDBC API中还提供了3个扩展了java.sql.Date,java.sql.Time,和java.sql.TimeStamp,这三个类非别和标准SQL类型中的DATE,TIME和TIMESTAMP类型对应
在标准SQL中,DATE类型表示日期,TIME类型表示时间,TIMESTAMP类型表示时间戳,同时包含日期和时间信息

-------------------------------------------------------------------------
映射类型 Java类型 标准SQL类型 描述
date java.util.Date或java.sql.Date DATE 代表日期yyyy-MM-dd
time java.util.Date或java.sql.Time TIME 代表时间 hh:mm:ss
timestamp java.util.Date或java.sql.Timestamp TIMESTAMP 代表时间和日期 yyyy-MM-dd hh:mm:ss
calendar java.util.Calendar TIMESTAMP 代表时间和日期 yyyy-MM-dd hh:mm:ss
calendar_date java.util.Calendar DATE 代表日期yyyy-MM-dd
-------------------------------------------------------------------------

时间: 2024-12-19 04:17:34

Hibernate4.x之映射文件的相关文章

【8.0】注解方式代替映射文件

1.Book类 package cn.siggy.pojo; import java.util.Date; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; //entity表示需要持久化的实体类

spring配置和映射文件

配置 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema

SQL映射文件-----MySQL关系映射【1对1,1对多,多对多】

SSM框架下,mapper.xml 中 association 标签和 collection 标签的使用 当数据库中表与表之间有关联时,在对数据库进行操作时,就不只是针对某一张表了,需要联表查询 MyBatis中如何实现联表查询 1.首先新建两张表 学生表(student) ID:stu_id 姓名:stu_name 年龄:stu_age 性别:stu_gender 所在班级:g_id 班级表(grade) ID:g_id 班级名称:g_name 学生表和班级表通过 g_id 进行关联,一个班级

Java利用内存映射文件实现按行读取文件

我们知道内存映射文件读取是各种读取方式中速度最快的,但是内存映射文件读取的API里没有提供按行读取的方法,需要自己实现.下面就是我利用内存映射文件实现按行读取文件的方法,如有错误之处请指出,或者有更好更快的实现方式麻烦也提供一下代码. 代码如下: public class testMemoryMappedFile { public static void main(String[] agrs) throws IOException{ RandomAccessFile memoryMappedFi

mybatis 中 sql 映射文件 select 标签以及 入 resultMap 标签的应用

1.自定义某个 javabean 的封装规则: 注:可以看到,select 标签中引用了 定义好的 resultMap 的值.resultMap 标签中的 type 为javabean 类型,id 为唯一标识.id 子标签定义主键(这样定义底层会有优化.)column 属性为字段名,property 属性为字段值. 注:可以看到测试结果没有出现问题,说明代码没有错误. 2.自定义某个 javabean 的级联属性封装: a.准备工作:mysql 数据库中,在之前 tbl_employees 表的

内存映射文件

一段内存地址空间,映射着物理存储器上一个已经存在于磁盘上的文件.在对该文件进行操作之前必须首先对文件进行映射.使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作. 内存映射文件,是由一个文件到一块内存的映射.Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping). API: HANDLE CreateFileMapping(HANDLE hFile,LPSECURITY_ATTRIBUTES lpFileMappingAttribute

Hibernate中如何完成持久化类和数据库映射文件

因为最近写项目需要要到,就在这里码码字,方便以后做一个参考,在这里,我通过的是myeclipse的反向工程来配置持久化类和数据的映射文件的. 1.打开myeclipse,打开数据库视图,对应的是Windows->open perspective->myeclipse database explore. 2.在出现的视图中我们选择对应的数据库,右键进行连接,接着去我们连接的对应的数据库下获取相应的table,在选定的table上右键,就会出现如下图所示的样例 选择上面的hibernate rev

MyBatis -- sql映射文件详解

MyBatis 真正的力量是在映射语句中.和对等功能的jdbc来比价,映射文件节省很多的代码量.MyBatis的构建就是聚焦于sql的. sql映射文件有如下几个顶级元素:(按顺序) cache配置给定命名空间的缓存. cache-ref从其他命名空间引用缓存配置. resultMap最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来加载你的对象. parameterMap已经被废弃了!老式风格的参数映射.内联参数是首选,这个元素可能在将来被移除. sql可以重用的SQL块,也可以被其他

6.Mybatis 映射文件标签详解

编写的测试代码在下面,没有jar包(上传的大小限制啦) 1.1     Mybatis映射文件(核心) 1.1.1 输入映射 1.1.1.1  ParameterType 指定输入参数的java类型,可以使用别名或者类的全限定名.它可以接收简单类型.POJO.HashMap. 1.1.1.1.1      传递简单类型 参考需求:根据用户ID查询用户信息. 1.1.1.1.2      传递POJO对象 1.1.1.1.2.1     需求 根据用户性别和用户名称来查询用户信息 1.1.1.1.