一、映射对象标识符

     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

     表示手工指定主键的值。

 

二、Java类型、Hibernate类型和SQL类型之间的关系

    

    

     在标准 SQL 中,DATE 类型表示日期,TIME 类型表示时间,TIMESTAMP 类型表示时间戳, 同时包含日期和时间信息。

    

 

三、映射值类型集合

1.Set

     Customer类与Order类为一对多的关联关系,在Customer类中定义了一个集合类型orders,它用来存放所有与Customer对象关联的Order对象。假如Customer类有一个集合属性address,用来存放Customer对象的所有地址,那么address和orders有相同的定义形式。

	private Set<Order> orders = new HashSet<Order>(); //保存多个订单
private Set<String> address = new HashSet<String>(); //保存多个地址

     orders属性与address属性的区别在于,前者存放的是实体类型的Order对象,后者存放的是值类型的String对象。实体类型的对象有单独的OID和独立的生命周期,而值类型的对象没有单独的OID和独立的生命周期。

    

Customer.java

public class Customer{

	private Integer uid;
private String username; private Set<String> address = new HashSet<String>(); //保存多个地址 public Customer(){
} public Customer(int uid,String username,Set<String> address){
this.uid = uid;
this.username = username;
this.address = address;
} //get、set方法....
}

 

Customer.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> <class name="com.kiwi.domain.Customer" table="t_customer"> <id name="uid">
<generator class="native" />
</id> <property name="username" type="string" column="t_name" /> <!-- address属性,Set集合
name: 类的的属性名
table: 集合的表名
-->
<set name="address" table="cus_address">
<!-- 外键 -->
<key column="cusId" />
<!-- 集合的属性 -->
<element type="string" column="address" />
</set> </class> </hibernate-mapping>

Test.java

			Customer c = new Customer();
c.setUsername("Tom"); c.getAddress().add("朝阳区");
c.getAddress().add("海淀区"); session.save(c);

结果:

t_customer           cus_address

 

 

2.List

  

Customer.java

public class Customer{

	private Integer uid;
private String username; private List<String> emails = new ArrayList<String>(); //get、set......
}

Customer.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> <class name="com.kiwi.domain.Customer" table="t_customer"> <id name="uid">
<generator class="native" />
</id> <property name="username" type="string" column="t_name" /> <!-- emails属性 List集合 -->
<list name="emails" table="cus_email">
<key column="cusID"/>
<list-index column="idx"/>
<element type="string" column="email"/>
</list> </class> </hibernate-mapping>

Test.java

			Customer c = new Customer();
c.setUsername("Tom");
c.getEmails().add("111@163.com");
c.getEmails().add("222@163.com");
c.getEmails().add("111@163.com");
session.save(c);

结果:

t_customer             cus_email

    

 

3.Map

Customer.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> <class name="com.kiwi.domain.Customer" table="t_customer"> <id name="uid">
<generator class="native" />
</id> <property name="username" type="string" column="t_name" /> <!-- map -->
<map name="address" table="cus_address"> <key column="cusID"/>
<map-key type="string" column="key_"/>
<element column="value_" type="string"/>
</map> </class> </hibernate-mapping>

Test.java

			Customer c = new Customer();
c.setUsername("Tom");
c.getAddress().put("公司","朝阳区");
c.getAddress().put("住宅","昌平区");
session.save(c);

结果:

    

Hibernate基础学习(四)—对象-关系映射(上)的更多相关文章

  1. Hibernate基础学习(五)—对象-关系映射(下)

    一.单向n-1 单向n-1关联只需从n的一端可以访问1的一端. 域模型: 从Order到Customer的多对一单向关联.Order类中定义一个Customer属性,而在Customer类不用存放Or ...

  2. hibernate学习四(关系映射一对一与组件映射)

    一.关系映射简介 在数据库中,表与表的关系,仅有外键.但使用hibernate后,为面向对象的编程,对象与对象的关系多样化:如 一对一,一对多,多对多,并具有单向和双向之分. 开始练习前,复制上一次项 ...

  3. Hibernate映射--基本类映射和对象关系映射(转)

    原文地址:http://blog.csdn.net/lovesummerforever/article/details/20901011   尊重原创,请访问原网址 回想一些我们在没有学习ssh的时候 ...

  4. Hibernate的核心对象关系映射

    Hibernate的核心就是对象关系映射: 加载映射文件的两种方式: 第一种:<mapping resource="com/bie/lesson02/crud/po/employee. ...

  5. 《MVC+EF》——用DBFirst创建ADO.NET实体数据模型和对象关系映射

    转载于:http://blog.csdn.net/zhoukun1008/article/details/50528145 现在越来越喜欢MVC了,不光是因为ITOO中用到了他,而是因为它里面包含了很 ...

  6. 3hibernate核心对象关系映射 xxx.hbm.xml

    Hibernate的核心就是对象关系映射: 加载映射文件的两种方式: 第一种:<mapping resource="com/bie/lesson02/crud/po/employee. ...

  7. [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. [原创]java WEB学习笔记77:Hibernate学习之路---Hibernate 版本 helloword 与 解析,.环境搭建,hibernate.cfg.xml文件及参数说明,持久化类,对象-关系映射文件.hbm.xml,Hibernate API (Configuration 类,SessionFactory 接口,Session 接口,Transaction(事务))

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. hibernate(四)__由表逆向创建Domain对象和对象关系映射文件

    之前我们是手写Domain对象和对象关系映射文件->然后生成数据库中的Table. 现在我们反过来先在数据库中建好Table->然后用工具生成Domain对象和对象关系映射文件. 步骤: ...

随机推荐

  1. Hadoop基本开发环境搭建(原创,已实践)

    软件包: hadoop-2.7.2.tar.gz hadoop-eclipse-plugin-2.7.2.jar hadoop-common-2.7.1-bin.zip eclipse  jdk1.8 ...

  2. Abp zero 3.0.1发布

    v3.1.0 (2017-02-14) Angular 2.x UI Angular 2 AOT (Ahead Of Time) Compilation, and HMR (Hot Module Re ...

  3. SQL Server 2008R2 企业版 百度云下载地址

    SQL Server 2008R2 (百度云下载地址:链接: http://pan.baidu.com/s/1mi34II8 密码: yc1w)   ASP.NET MVC4.0+ WebAPI+Ea ...

  4. Docker存储驱动之Btrfs简介

    简介 Btrfs是下一代的copy-on-write文件系统,它支持很多高级特性,使其更加适合Docker.Btrfs合并在内核主线中,并且它的on-disk-format也逐渐稳定了.不过,它的很多 ...

  5. javascript深入理解js闭包(转载)

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...

  6. C#调用PB写的com组件dll

    背景 小编为了使用C#去模仿PB代码的加密算法,结果发现PB算法中,的long类型只有21亿,实际上传入的数值达到了78亿,造成了数据溢出,精度丢失的情况. 然而PB的算法已经使用C#不可以还原(C# ...

  7. vuejs数据双向绑定原理(get & set)

    前端的数据双向绑定指的是view(视图)和model(数据)两者之间的关系:view层是页面上展示给用户看的信息,model层一般是指通过http请求从后台返回的数据.view到model的绑定都是通 ...

  8. Selenium 使用过程遇到问题随笔

    最近正在学习Selenium,自学是比较难的,也很感谢网络环境中,各位大大的博文帮助. 也希望在此能够记录一下从小白学习使用selenium测试的过程,也希望能对别人有所帮助. 关于环境部署,以及入门 ...

  9. 通过代码在eclips中添加Maven Dependencies依赖包的简单方法

    条件是已经正确解压了maven包并配置好了环境变量: 然后新建一个maven项目,(可在other中找到) 然后打开最下边的配置文件pom.xml: 打开后在文本下边选项选pom.xml选项: 在&l ...

  10. dtree大型树插件

    一.dtree简介 dtree是一个由JavaScript编写成的简单的树形菜单组件,目前免费并且开源.同时支持动态从数据库引入数据. 二.使用方法 1.下载dtree.js及dtree.css 下载 ...