一、Hibernate中常用的主键生成方式有如下几种:

1)identity: 用于自动生成主键方式,除了 Oracle 不支持,其他数据库一般都支持(较常用)

2)sequence: Oracle 中使用,用序列生成 ID 主键

3)native: 主键生成方式如果是 native,那就看配置文件 hibernate.cfg.xml 中方言<property name="dialect">是什么,如果方言是 Mysql,相当于 identity,如果方言是 Oracle,相当于 sequence

4)increment: 不常用

5)assigned: 不常用,手动生成 id

二、案例:5种主键生成方式演示

1、项目结构

2、新建Foo:用于测试的POJO

package com.xsyu.tts.po;

public class Foo {
private Integer id;
private String value; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getValue() {
return value;
} public void setValue(String value) {
this.value = value;
}
}
  • identity:使用最频繁,除了Oracle,其他数据库一般都有

3、数据库表t_foo:主键生成方式为自动生成主键

DROP TABLE IF EXISTS t_foo;
CREATE TABLE t_foo (
t_id int(11) NOT NULL AUTO_INCREMENT,
t_value varchar(50) NOT NULL,
PRIMARY KEY (t_id)
) ENGINE=InnoDB;



4、新建Foo.hbm.xml:如果数据库支持自动生成主键方式,则可以使用identity, mysql数据库常用此方式。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.tarena.tts.po">
<class name="Foo" table="t_foo">
<id name="id" type="java.lang.Integer" column="t_id">
<!-- 用来指明主键的生成方式 -->
<generator class="identity"></generator>
</id>
<property name="value" type="java.lang.String" column="t_value" />
</class>
</hibernate-mapping>

5、hibernate.cfg.xml中进行配置

<mapping resource="com/xsyu/tts/po/Foo.hbm.xml" />

6、新建TestPersistence

public class TestPersistence {
/**
* 用于测试Hibernate主键生成方式 主键生成方式: identity sequence native
*/
@Test
public void testGenerator() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// identity
// 不需要指定id
Foo foo = new Foo();
foo.setValue("foo_value1");
session.save(foo);
tx.commit();
session.close();
}
}

7、测试


8、查询数据库


  • sequence:Oracle数据库常用

9、创建Oracle数据库表并创建生成ID的sequence


10、修改配置文件hibernate.cfg.xml :修改成Oracle数据库的

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 数据库连接信息 -->
<property name="connection.url">
jdbc:oracle:thin:@192.168.0.26:1521:tarena
</property>
<property name="connection.username">openlab</property>
<property name="connection.password">open123</property>
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>
<!-- Hibernate配置信息 -->
<!-- dialect方言,用亍配置生成针对哪个数据库的SQL语句 -->
<property name="dialect">
<!--方言类,Hibernate提供的,用亍封装某种特定数据库的方言 -->
org.hibernate.dialect.OracleDialect
</property>
<property name="hibernate.show_sql">true</property>
<!-- 在配置文件中关联映射文件 -->
<mapping resource="com/xsyu/tts/po/User.hbm.xml" />
<mapping resource="com/xsyu/tts/po/Foo.hbm.xml" />
</session-factory>
</hibernate-configuration>

11、修改映射文件Foo.hbm.xml :修改为sequence方式连接

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.tarena.tts.po">
<class name="Foo" table="t_foo">
<id name="id" type="java.lang.Integer" column="t_id">
<!-- 用来指明主键的生成方式 -->
<generator class="sequence">
<param name="sequence">foo_seq</param>
</generator>
</id>
<property name="value" type="java.lang.String" column="t_value" />
</class>
</hibernate-mapping>

12、测试


13、查看数据库


  • native :native根据配置文件的方言选择是identity还是squence

<!-- 用来指明主键的生成方式 -->
<generator class="native">
<param name="sequence">foo_seq</param>
</generator>



如果是 mysql 数据库,
<param name="sequence">foo_seq</param>是不起作用的,但也不会出错;
如果是 oracle 数据库,
<param name="sequence">foo_seq</param>就会起作用,
所以一般我们会加上这句话,这样通用性更强。

  • increment :不常用,如果主键生成方式为increment 



新建数据库表t_foo时不需要写“auto_increment"


插入数据时,同样也不需要指定ID


查看控制台,Hibernate执行了2条SQL

increment生成主键的方式是先“select max(t_id) from t_foo",从t_foo中找到最大的id,之后将max(t_id)加1,这样就保证了主键唯一。但是这样也有风险,当并发访问时会有风险。不建议使用。

  • assigned: 没有任何自动方式,需要用户自己指定,使用也较少

设置主键为assigned


必须手动设置ID

Hibernate——(3)主键生成方式的更多相关文章

  1. java web从零单排第二十一期《Hibernate》主键的生成方式,用户增加与显示用户列表

    1.新建register.jsp <%@ page language="java" import="java.util.*" pageEncoding=& ...

  2. hibernate 主键生成方式

    1)assigned主键由外部程序负责生成,无需Hibernate参与. 2)hilo通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态. 3)seqhilo与hilo 类 ...

  3. HIbernate学习笔记2 之 主键生成方式

    一.hibernate主键生成方式: 1.常用方式:mysql:自增长生成主键(identity) <generator class="identity"> </ ...

  4. hibernate(2) —— 主键策略

    框架提供了三种主键生成方式,一种是由用户自己维护,一种是由hibernate框架维护,另一种是由数据库维护. 自己维护就是在插入数据的时候,一定要指定主键的值,否则会出错,如果由框架维护和由数据库维护 ...

  5. 大家一起撸代码之——Hibernate各种主键生成策略与配置详解

    1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...

  6. Hibernate各种主键生成策略与配置详解

    出自:http://www.cnblogs.com/kakafra/archive/2012/09/16/2687569.html 1.assigned 主键由外部程序负责生成,在 save() 之前 ...

  7. Hibernate各种主键生成器策略与配置详解(转载)

    http://www.cnblogs.com/kakafra/archive/2012/09/16/2687569.html 1.assigned 主键由外部程序负责生成,在 save() 之前必须指 ...

  8. Hibernate各种主键生成策略与配置详解《转》

    1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...

  9. hibernate的主键生成策略

    一共是13种,其中包括native native: 对于 oracle 采用 Sequence 方式,对于MySQL 和 SQL Server 采用identity(自增主键生成机制),native就 ...

随机推荐

  1. Maven学习总结(16)——深入理解maven生命周期和插件

    在项目里用了快一年的maven了,最近突然发现maven项目在eclipse中build时非常慢,因为经常用clean install命令来build项目,也没有管那么多,但最近实在受不了乌龟一样的b ...

  2. MySql 中的setAutoCommit方法

    引言 setAutoCommit方法用一句话说就是用来保持事务完整性.一个系统的更新操作可能涉及多张表,这个时候,就须要用多个Sql语句来实现,实际上我认为这个东西就是用来实现事务的. 当我们进行多条 ...

  3. C# AutoMapper

    http://www.cnblogs.com/xlhblogs/p/3356748.html

  4. maven 配置Project Facets时further configuration available不出来问题

    如果下边的 further configuration available不出来 把Dynamic web module 去掉勾选,应用与项目,然后再点开项目的properties,再选中Dynami ...

  5. LA 3882 - And Then There Was One(约瑟夫 递归)

    看题传送门 题目大意: N个数排成一圈,第一次删除m,以后每k个数删除一次,求最后一被删除的数. 如果这题用链表或者数组模拟整个过程的话,时间复杂度都将高达O(nk),而n<=10000,k&l ...

  6. 度量空间(metric space)

    一个度量空间(metric space)由一个有序对(ordered pair)(M,d) 表示,其中 M 是一种集合,d 是定义在 M 上的一种度量,是如下的一种函数映射: d:M×M→R 且对于任 ...

  7. 23、uevent/hotplug热拔插机制

    (class_device_create的目的是为了让mdev根据它注册的信息来创建设备节点) class_device_create class_device_register class_devi ...

  8. css 单行图片文字水平垂直居中汇总

    (1) 水平居中 a. 行内元素水平居中 因为img是行内元素(行内块级元素也一样)父级元素设置text-align:center即可,例如: <div style="width: 6 ...

  9. MySQLDump在使用之前一定要想到的事情

    MySQLDump经常用于迁移数据和备份. 下面创建实验数据,两个数据库和若干表create database db1 ;use db1;create table t1(id int primary ...

  10. [TypeStyle] Add responsive styles using TypeStyle Media Queries

    Media queries are very important for designs that you want to work on both mobile and desktop browse ...