文档章节

Hibernate的ID生成策略

maskleo
 maskleo
发布于 2015/10/15 22:11
字数 866
阅读 13
收藏 0

1.介绍

Hibernate是目前最为常用的ORM框架,当然也有人会选择iBATIS或者其他的架构.这里我们着重讲Hibernate的ID生成策略

 

2.可选的ID策略生成方式

 

(1)native/auto

根据不同的数据库采用不同的ID生成方式,例如:在SQL Server中采用identity; 在MySQL中采用auto_increment; 在ORACLE中就会采用sequence, 注意hibernate会自动帮你创建一个名字叫hibernate_sequence的序列,不用自己去创建.这也是最常用和省事的.

 

例子:采用xml方式配置

 

<hibernate-mapping>
 <class name="abu.csdn.bean.User" table="users">
  <id column="uid" name="uid" type="java.lang.Long">
   <generator class="native"/>
  </id>

   .....

  </class>

<hibernate-mapping>

例子:采用注解方式(注意只要在id的getter上写上@Id就可以了,默认就是@GeneratedValue(strategy = GenerationType.AUTO), 另外(strategy = GenerationType.AUTO)也可以不写.)以下3种方式结果都是一样.

(a)

@Entity(name = "users")
public class User {

    private long uid;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public long getUid() {
        return uid;
    }

    public void setUid(long uid) {
        this.uid = uid;
    }
}

(b)

@Entity(name = "users")
public class User {

    private long uid;

    @Id
    @GeneratedValue
    public long getUid() {
        return uid;
    }

    public void setUid(long uid) {
        this.uid = uid;
    }
}

 

 (c)

@Entity(name = "users")
public class User {

    private long uid;

    @Id
    public long getUid() {
        return uid;
    }

    public void setUid(long uid) {
        this.uid = uid;
    }
}

 

(2)identity

这种策略在采用SQL Server时,相当于SQL Server的identity关键字, 不能用在Oracle中.

例子:采用xml配置方式

<hibernate-mapping>
 <class name="abu.csdn.bean.User" table="users">
  <id column="uid" name="uid" type="java.lang.Long">
   <generator class="identity"/>
  </id>

   .....

  </class>

<hibernate-mapping>

 

例子:采用注解方式

@Entity(name = "users")
public class User {

    private long uid;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long getUid() {
        return uid;
    }

    public void setUid(long uid) {
        this.uid = uid;
    }
}

(3)sequence

当然采用sequence的就是oracle了.生成方式开始已经说过了.如果要指定sequence的名字那么请看下面两个例子

例子:采用xml配置

<hibernate-mapping>
 <class name="abu.csdn.bean.User" table="users">
  <id column="uid" name="uid" type="java.lang.Long">
   <generator class="sequence">
      <param name="sequence">csu_user_sequence</param>   </generator>
  </id>
   .....
  </class>
<hibernate-mapping>

例子:采用注解方式

@Entity(name = "users")
@SequenceGenerator(name = "userSEQ", sequenceName = "csu_user_sequence")
public class User {

    private long uid;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "userSEQ")
    public long getUid() {
        return uid;
    }

    public void setUid(long uid) {
        this.uid = uid;
    }
}

(4)table

使用一张数据表来管理所有的数据表的主键生成,这个最为麻烦,但是用得好会非常方便,尤其是大型项目,数据表非常多的时候.这里只举注解的例子,后说明

@Entity
@TableGenerator(name = "csdnGenerator", table = "csdn_generator", pkColumnName = "keyName", valueColumnName = "keyValue", pkColumnValue = "teacher", allocationSize = 1)
public class Teacher implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "sisTableGen")
    public long getTeaId() {
        return teaId;
    }

    public void setTeaId(long teaId) {
        this.teaId = teaId;
    }
}

 

 说明:

(a)@TableGenerator表示这个表要采用table的id生成方式,括号中的各个参数说明:

(i) name表示生成器的名字,在随后实体的id中要指明.

(ii)table表示在数据库中生成的管理id生成策略的表的名字.

(iii)pkColumnName表示主键的名字,也就是说记录每个表主键的名字

(iv)pkColumnValue表示主键的值,每个表主键的值

(v)valueColumnName表示这个表要记录的主键的名字,例如这里是teacher,那么在csdn_generator表中就用teacher来记录主键的值

(vi)allocationSize表示每次取得一个主键的值之后增长的步长值,这里是每次递增1.

(b)@GeneratedValue表示在主键中指明具体的id生成策略,,strategy表示要采用的ID生成策略,由于这里采用的是table,当然就是GenerationType.TABLE了,generator指出id生成器的名字,这里就是csdnGenerator.

版权声明:本文为博主原创文章,未经博主允许不得转载。

本文转载自:http://blog.csdn.net/csuliky/article/details/5719304

共有 人打赏支持
maskleo
粉丝 15
博文 128
码字总数 17344
作品 0
深圳
程序员
私信 提问
Hibernate学习之SessionFactory的opensession 和 getCu...

1 。 Hibernate 的 Id 生成策略 XXOO.hbm.xml 下 class 标签的 主键id 标签中 使用 <generator/> 标签指定 生成策略。 <hibernate-mapping> <class name="com.myeclipse.OneToOne.Student2" ......

coffee_guy
2013/03/01
0
0
Hibernate4之JPA规范配置详解

@Table Table用来定义entity主表的name,catalog,schema等属性。 属性说明: name:表名 catalog:对应关系数据库中的catalog schema:对应关系数据库中的schema UniqueConstraints:定义一...

Zhao-Qian
2013/11/11
0
0
JPA主键生成器和主键生成策略

JPA中创建实体时,需要声明实体的主键及其主键生成策略。我们有一个实体类叫做Email,其主键上声明如下: @Id@Column(name = "EMAIL_ID")@GeneratedValue(strategy = GenerationType.SEQUENC...

Element0506
2015/11/13
0
0
理解JPA注解@GeneratedValue

一、JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue设定的.这里的@id和@GeneratedValue都是JPA的标准用法,...

一生只为虞美人
07/25
0
0
基于按annotation的hibernate主键生成策略

这里讨论代理主键,业务主键(比如说复合键等)这里不讨论。 一、JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@Generate...

_白开水_
2013/10/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Windows 10 设置 Java 环境变量

首先你需要在我的电脑中打开,找到环境变量属性。 找到环境变量属性 找到环境变量属性后单击将会看到下面的设置界面。 在这个界面中设置高级系统设置。 环境变量 在弹出的界面中选择设置环境...

honeymose
29分钟前
1
0
用any-loader封装jQuery的XHR —— 随便写着玩系列

哎,都说没人用JQuery啦,叫你别写这个。 其实我也是好高骛远使用过npm上某个和某个很出名的XHR库,嗯,认识我的人都知道我喜欢喷JQ,以前天天喷,见面第一句,你还用JQ,赶紧丢了吧。但我也...

曾建凯
今天
5
0
聊聊storm的AggregateProcessor的execute及finishBatch方法

序 本文主要研究一下storm的AggregateProcessor的execute及finishBatch方法 实例 TridentTopology topology = new TridentTopology(); topology.newStream("spout1", spout......

go4it
今天
4
0
大数据教程(7.5)hadoop中内置rpc框架的使用教程

博主上一篇博客分享了hadoop客户端java API的使用,本章节带领小伙伴们一起来体验下hadoop的内置rpc框架。首先,由于hadoop的内置rpc框架的设计目的是为了内部的组件提供rpc访问的功能,并不...

em_aaron
今天
5
0
CentOS7+git+github创建Python开发环境

1.准备CentOS7 (1)下载VMware Workstation https://pan.baidu.com/s/1miFU8mk (2)下载CentOS7镜像 https://mirrors.aliyun.com/centos/ (3)安装CentOS7系统 http://blog.51cto.com/fengyuns......

枫叶云
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部