hibernate对应id 生成规则

数据库的设计和操作中,我们通常会给表建立主键。 
主键,可以分为自然主键和代理主键。 
自然主键表示:采用具有业务逻辑含义的字段作为表的主键。比如在用户信息表中,采用用户的身份证号码作为主键。但是这样一来,随着业务逻辑的变化,主键就有可能要更改。比如,假设哪天身份证号码升级成19,2位,那。。。。。。。 
代理主键:在表中人为的增加一个字段,该字段并没有表示任何的业务逻辑,仅仅用来标识一行数据。比如说在用户信息表中,增加一个用户ID的字段。用来表示该条用户信息的记录。

通常情况下,用的比较多的是代理主键的形式。而且,我们习惯于于让该主键字段能够自动增长,来保证其唯一性。但是,不同的数据库自动增长的方式并不是相同的。如在SQLSERVER中,用identity,MYSQL中,有increment,ORACLE中通常采用sequence。这样一来,在数据库的主键列操作上,便会显得比较麻烦。 
但是在Hibernate中,提供了主键生成策略。下面是比较常用的几种: 
1:assigned 
----表示在新增数据时由应用程序指定主键的值。主要针对主键是采用自然主键的形式。这种方式,适用于主键列不是自动增长列。

其缺点为在执行新增操作时,需查询数据库判断生成的主键是否已经存在。 
2:increment 
----表示新增数据操作时由hibernate自动生成主键值。其生成的值为:先查询该主键列的最大值,然后在最大值的基础上加上1.适用于采用代理主键形式的主键列。同样不能用于主键列是自动增长的表。但是,该主键生成策略也有些缺点。 
(1)新增数据前先查询一遍,影响了性能。 
(2)主键的类型只能为数值型的int或者long 
(3)并发操作时的冲突问题。 
3:identity 
----不如说是为sqlerver数据库量身定做的。主要适用于sqlserver数据库的自动增长列的表。 
4:native 
----表示根据不同的数据库采用不同的主键生成策略。比如,当前数据库为sqlserver,则会采用identity,如为oracle,则采用

oracle中的sequence等。区分数据库的不同是以hibernate主配置文件中sessionFactory中配置的数据库方言。

5.uuid

* 唯一主键生成办法。从Hibernate中提取出来

优点:避免了生成ID 时,与数据库的再次交道,性能上较高。但对于有的开发人员不太习惯这种id生成方式,UUID生成的32为的字符串,不同于identity 从1开始的整数。

Xml代码 
1.<id name="实体类属性名" type="java.lang.Integer">   
2.      <column name="对应表中主键字段名" />   
3.      <generator class="assiged|increment|identity|native|........" />   
4.</id>   
<id name="实体类属性名" type="java.lang.Integer"> 
      <column name="对应表中主键字段名" /> 
      <generator class="assiged|increment|identity|native|........" /> 
</id>

采用hibernate的主键生成策略,就可以比较灵活和方便的对表中的主键字段进行操作了。而且,不同的数据库,不同的主键形式,也只需要修改下映射文件就可以了

时间: 2024-10-11 05:23:37

hibernate对应id 生成规则的相关文章

服务器唯一id生成规则

在使用hashCode的时候,发现会出现相同id,虽然几率很小.虽然发现并不是hashCode的原因,而是其他逻辑的问题. 但是还是试着自己写了一个id生成器,有些id是int的,比如说任务id:有些id是long的,比如说玩家id. 先贴代码来看: private static AtomicInteger id = new AtomicInteger(0); public static long getId() { return (ServerKit.getServerId() & 0xFFF

Hibernate中ID生成策略

四.ID生成策略 第一种:XML配置ID 通过为<id>元素增加<generator>子元素,该子元素拥有class属性.常用的class属性有: (1)increment:用于为long.short.或者int类型生成唯一标识.只有在没有其他进程往同一张表中插入数据的时候才能使用.在集群不要使用.(极少使用) (2)native:让数据库自动选择identity,sequence,或者其他. (3)uuid:128位的UUID算法,产生String类型ID (4)identity

业务ID 生成规则

在实际业务中,是否碰到过这种场景: 我们需要一个单号,要在业务系统里面保证唯一,保证增长? 在运营过程,需要知道业务单发生的时间,最好不用经过系统查找就知道发生的时间? 在排障过程中,不用再次查找就知道,订单的一些信息? 业务ID 经常需要生成以方便后续跟踪使用.一般需要满足以下特性: 1. 唯一性 2. 可阅读 3. 增长 4. 数字类型? 5. 其他信息(payload) 所以,业务ID的生成,这里涉及两个问题: 1. ID 的规则,也就是ID 最终长什么样,满足什么约束 2. ID 生成策

hibernate的id生成

1.identity:用于MySql数据库.特点:递增 < id name="id" column="id"> < generator class="identity"/> < /id> 注:对于MySql数据库使用递增序列时需要在建表时对主键指定为auto_increment属性. 2.sequence:用于Oracle数据库 < id name="id" column="

hibernate(四)ID生成策略

一.ID生成策略配置 1.ID生成方式在xml中配置方式: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping p

Rhythmk 学习 Hibernate 03 - Hibernate 之 延时加载 以及 ID 生成策略

Hibernate 加载数据 有get,跟Load 1.懒加载: 使用session.load(type,id)获取对象,并不读取数据库,只有在使用返回对象值才正真去查询数据库. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 @Test    public void  test1()    {        Session session = null;         try {             session = Hiber

hibernate 中mysql的id生成策略

数据库的规划和操作号码大全中,咱们一般会给表建立长尾关键词挖掘工具的主键. 主键,可以分为天然主键和署理主键. 天然主键表明:选用具有事务逻辑意义的字段作为表的主键.比方在用户信息表中,选用用户的身份证号码作为主键.可是这样一来,跟着事务逻辑的变化,主键就有可能要更改.比方,假定哪天身份证号码升级成19,2位,那....... 署理主键:在表中人为的添加一个字段,该字段并没有表明任何的事务逻辑,仅仅用来标识一行数据.比方说在用户信息表中,添加一个用户ID的字段.用来表明该条用户信息的记录. 一般

hibernate ID生成策略配置

1.Student.hbm.xml配置 <hibernate-mapping package="com.wxh.hibernate.model"> <class name="Student" > <id name="id"> <generator class="uuid"></generator> </id> <property name="

[Hibernate开发之路](4)ID生成策略

一 对象关系数据库映射之Id 被映射的类必须定义相应数据库表主键字段.大多数类有一个JavaBeans风格的属性, 为每个实例包括唯一的标识. <id> 元素定义了该属性到数据库表主键字段的映射. <id name="propertyName" type="typename" column="column_name" unsaved-value="null|any|none|undefined|id_value&quo