码迷,mamicode.com
首页 > Web开发 > 详细

Hibernate基础学习(四)—对象-关系映射(上)

时间:2016-05-21 21:41:14      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

一、映射对象标识符

     Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键值来识别或区分同一个表的不同记录。Hibernate使用对象标识符(OID)来建立内存中的对象和数据库表中的记录的对应关系,对象的OID和数据库表的主键对应,为了保证OID的唯一性和不可变性,应该让Hibernate,而不是应用程序来为OID赋值。

    Hibernate推荐在数据表中使用代理主键,即不具备业务含义的字段。代理主键通常为整型,因为整型比字符串要节省更多数据库空间。

    在对象关系映射文件中,<id>元素用来设置对象标识符,<generator>子元素用来设定标识符生成器。

User.hbm.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

	<!-- 
		name: 表对应的实体类
		table: 类对应的数据库表
	 -->
	<class name="com.kiwi.domain.User" table="t_user">
		
		<!-- 配置主键 -->
		<id name="uid">
			<!-- 主键生成策略 -->
			<generator class="native"/>
		</id>
		
		<!-- 
			普通属性 : 数据库中的基本类型
			name:对象中的属性名
			type: 类型,如果不写,Hibernate会自动监测
			column: 对应表中的列名
			length:长度,不是所有的类型都有长度属性
			not-null:非空约束,默认为false
		-->
		<property name="username" type="string" column="t_name"/>
		<property name="password" type="string" column="t_pwd"/>
		<property name="age" type="int" column="t_age"/>
		<property name="birthday" type="date" column="t_birth"/>
		
	</class>

</hibernate-mapping> 

Hibernate提供内置标识符生成器如下:

     技术分享

 

1.increment

(1)increment 标识符生成器由Hibernate以递增的方式为代理主键赋值。
(2)Hibernate 会先读取数据库表中的主键的最大值,而向表中插入记录时,就在max(id)的基础上递增,增量为1。

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

 

2.identity

     identity标识符生成器由底层数据库来负责生成标识符, 它要求底层数据库把主键定义为自动增长字段类型。
适用范围:

(1)由于identity生成标识符的机制依赖于底层数据库系统,因此,要求底层数据库系统必须支持自动增长字段类型。支持自动增长字段类型的数据库包括: DB2,Mysql,SQLServer,Sybase等。

(2)OID 必须为long,int 或short类型,如果把OID定义为byte类型,在运行时会抛出异常。

 

3.native

     native标识符生成器依据底层数据库对自动生成标识符的支持能力,来选择使用identity,sequence或hilo标识符生成器。

适用范围:
     (1)由于native能根据底层数据库系统的类型,自动选择合适的标识符生成器,因此很适合于跨数据库平台开发。

     (2)OID必须为long,int 或short类型,如果把OID定义为byte类型,在运行时会抛出异常。

 

4.sequence

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

     技术分享

     Hibernate 在持久化一个对象时, 先从底层数据库的 news_seq 序列中获得一个唯一的标识号, 再把它作为主键值。
适用范围:

(1)由于sequence 生成标识符的机制依赖于底层数据库系统的序列,因此,要求底层数据库系统必须支持序列。支持序列的数据库包括: DB2,Oracle 等。

(2)OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常。

 

5.hilo

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

     技术分享

      table: 存放使用次数的表名。

      column: 上面表的列,存放使用次数。

      max_lo: 步长。

     Hibernate 在持久化一个对象时, 由Hibernate负责生成主键值。 hilo 标识符生成器在生成标识符时,需要读取并修改 HI_TABLE 表中的 NEXT_VALUE 值。

适用范围:
     (1)由于hilo生存标识符机制不依赖于底层数据库系统,因此它适合所有的数据库系统。

     (2)OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常。

 

6.uuid

适用范围:

     (1)由于 hilo 生成标识符机制不依赖于底层数据库系统, 因此它适合所有的数据库系统。

     (2)OID 必须为String类型。

 

7.assigned

     表示手工指定主键的值。

Hibernate基础学习(四)—对象-关系映射(上)

标签:

原文地址:http://www.cnblogs.com/yangang2013/p/5515593.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!