1. 基于相同实体类和表,实现相互映射,类的对象对应了表中的记录,不一样对象对应不一样的记录,不一样的记录对应不一样的对象 java
2. 表中不一样的记录经过主键来区分,不一样的对象经过对象id来区分,对象id是对象中的一个成员变量,该变量的值惟一性的标识了对象。 mysql
3.对象id和表主键的映射构成了ORM的核心 算法
4.数据库每每具有特定的主键生成算法,而对象系统则不具有,因此要配置特定的策略,以使对象具有和数据库中的数据同步的对象标识。 sql
1.主键生成策略是经过配置文件来实现的 数据库
2. 映射文件中<id>标签对应的是表中的主键列 服务器
3.<generator>子标签配置主键的生成策略 网络
4.class属性值指定具体的策略,能够有如下identity,sequence,hilo,native,swqhilo,increment,uuid,assigned,foreign,select session
<id name="id" column="表主键字段名" type="java.lang.Integer"> 并发
<generator class="设置主键生成策略类型"/> oracle
</id>
1.Assigned
Assigned方式由程序生成主键值,而且要在save()以前指定不然会抛出异常
特色:主键的生成值彻底由用户决定,与底层数据库无关。用户须要维护主键值,在调用session.save()以前要指定主键值。
2.Hilo
Hilo使用高低位算法生成主键,高低位算法使用一个高位值和一个低位值,而后把算法获得的两个值拼接起来做为数据库中的惟一主键。Hilo方式须要额外的数据库表和字段提供高位值来源。默认请况下使用的表是
hibernate_unique_key,默认字段叫做next_hi。next_hi必须有一条记录不然会出现错误。
特色:须要额外的数据库表的支持,能保证同一个数据库中主键的惟一性,但不能保证多个数据库之间主键的惟一性。Hilo主键生成方式由Hibernate 维护,因此Hilo方式与底层数据库无关,但不该该手动修改hi/lo算法使用的表的值,不然会引发主键重复的异常。
3.Increment
Increment方式对主键值采起自动增加的方式生成新的主键值,但要求底层数据库的支持Sequence。如Oracle,DB2等。须要在映射文件xxx.hbm.xml中加入Increment标志符的设置。
特色:由Hibernate自己维护,适用于全部的数据库,不适合多进程并发更新数据库,适合单一进程访问数据库。不能用于群集环境。
4.Identity
Identity当时根据底层数据库,来支持自动增加,不一样的数据库用不一样的主键增加方式。
特色:与底层数据库有关,要求数据库支持Identity,如MySQl中是 auto_increment, SQL Server 中是Identity,支持的数据库有MySql、SQLServer、DB二、Sybase和HypersonicSQL。 Identity无需Hibernate和用户的干涉,使用较为方便,但不便于在不一样的数据库之间移植程序。
5.Sequence
Sequence须要底层数据库支持Sequence方式,例如Oracle数据库等
特色:须要底层数据库的支持序列,支持序列的数据库有DB二、PostgreSql、Qracle、SAPDb等在不一样数据库之间移植程序,特别从支持序列的数据库移植到不支持序列的数据库须要修改配置文件
6.Native
Native主键生成方式会根据不一样的底层数据库自动选择Identity、Sequence、Hilo主键生成方式。
特色:根据不一样的底层数据库采用不一样的主键生成方式。因为Hibernate会根据底层数据库采用不一样的映射方式,所以便于程序移植,项目中若是用到多个数据库时,可使用这种方式。
7.UUID
UUID使用128位UUID算法生成主键,可以保证网络环境下的主键惟一性,也就可以保证在不一样数据库及不一样服务器下主键的惟一性。
特色;可以保证数据库中的主键惟一性,生成的主键占用比较多的存贮空间
8.Foreign
Foreign用于一对一关系中,保证生成主键的惟一性,支持SQL Server和MySQL。
1. UUID、increment、Hilo、assigned对数据库无依赖
2. identity:依赖Mysql或sql server,主键值不禁Hibernate维护
3. sequence:适合于oracle等支持序列的dbms,主键值不禁hibernate维护,由序列产生
4. native:根据底层数据库的具体特性选择适合的主键生成策略,若是是mysql或sqlserver,选择identity,若是是oracle,选择sequence。
提升系统新能的主要作法就是显著减小数据库的访问次数。经过上面的分析,可做为咱们考虑的一个指标。利用uuid方式生成Hibernate主键将提供最好的性能和数据库平台适应性。
你们积极交流,本身项目中的主键生成是什么策略,以及优缺点是什么,是如何处理的,给项目带来的好处。