hibernate id 生成策略

来源:互联网 发布:淘宝联盟可以招代理吗 编辑:程序博客网 时间:2024/05/15 17:13

1.介绍

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

 

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

 

(1)native/auto

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

 

例子:采用xml方式配置

 

[xhtml] view plaincopy
  1. <hibernate-mapping>  
  2.  <class name="abu.csdn.bean.User" table="users">  
  3.   <id column="uid" name="uid" type="java.lang.Long">  
  4.    <generator class="native"/>  
  5.   </id>  
  6.   
  7.    .....  
  8.   
  9.   </class>  
  10.   
  11. <hibernate-mapping>  

 

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

(a)

 

[java] view plaincopy
  1. @Entity(name = "users")  
  2. public class User {  
  3.   
  4.     private long uid;  
  5.   
  6.     @Id  
  7.     @GeneratedValue(strategy = GenerationType.AUTO)  
  8.     public long getUid() {  
  9.         return uid;  
  10.     }  
  11.   
  12.     public void setUid(long uid) {  
  13.         this.uid = uid;  
  14.     }  
  15. }  

 

(b)

 

[c-sharp] view plaincopy
  1. @Entity(name = "users")  
  2. public class User {  
  3.   
  4.     private long uid;  
  5.   
  6.     @Id  
  7.     @GeneratedValue  
  8.     public long getUid() {  
  9.         return uid;  
  10.     }  
  11.   
  12.     public void setUid(long uid) {  
  13.         this.uid = uid;  
  14.     }  
  15. }  

 

 

 (c)

 

[c-sharp] view plaincopy
  1. @Entity(name = "users")  
  2. public class User {  
  3.   
  4.     private long uid;  
  5.   
  6.     @Id  
  7.     public long getUid() {  
  8.         return uid;  
  9.     }  
  10.   
  11.     public void setUid(long uid) {  
  12.         this.uid = uid;  
  13.     }  
  14. }  

 

 

(2)identity

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

例子:采用xml配置方式

 

[c-sharp] view plaincopy
  1. <hibernate-mapping>  
  2.  <class name="abu.csdn.bean.User" table="users">  
  3.   <id column="uid" name="uid" type="java.lang.Long">  
  4.    <generator class="identity"/>  
  5.   </id>  
  6.   
  7.    .....  
  8.   
  9.   </class>  
  10.   
  11. <hibernate-mapping>  

 

 

例子:采用注解方式

 

[java] view plaincopy
  1. @Entity(name = "users")  
  2. public class User {  
  3.   
  4.     private long uid;  
  5.   
  6.     @Id  
  7.     @GeneratedValue(strategy = GenerationType.IDENTITY)  
  8.     public long getUid() {  
  9.         return uid;  
  10.     }  
  11.   
  12.     public void setUid(long uid) {  
  13.         this.uid = uid;  
  14.     }  
  15. }  

 

(3)sequence

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

例子:采用xml配置

 

[xhtml] view plaincopy
  1. <hibernate-mapping>  
  2.  <class name="abu.csdn.bean.User" table="users">  
  3.   <id column="uid" name="uid" type="java.lang.Long">  
  4.    <generator class="sequence">  
  5.       <param name="sequence">csu_user_sequence</param>   </generator>  
  6.   </id>  
  7.    .....  
  8.   </class>  
  9. <hibernate-mapping>  

 

例子:采用注解方式

 

[java] view plaincopy
  1. @Entity(name = "users")  
  2. @SequenceGenerator(name = "userSEQ", sequenceName = "csu_user_sequence")  
  3. public class User {  
  4.   
  5.     private long uid;  
  6.   
  7.     @Id  
  8.     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "userSEQ")  
  9.     public long getUid() {  
  10.         return uid;  
  11.     }  
  12.   
  13.     public void setUid(long uid) {  
  14.         this.uid = uid;  
  15.     }  
  16. }  

 

(4)table

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

 

[java] view plaincopy
  1. @Entity  
  2. @TableGenerator(name = "csdnGenerator", table = "csdn_generator", pkColumnName = "keyName", valueColumnName = "keyValue", pkColumnValue = "teacher", allocationSize = 1)  
  3. public class Teacher implements Serializable {  
  4.     @Id  
  5.     @GeneratedValue(strategy = GenerationType.TABLE, generator = "sisTableGen")  
  6.     public long getTeaId() {  
  7.         return teaId;  
  8.     }  
  9.   
  10.     public void setTeaId(long teaId) {  
  11.         this.teaId = teaId;  
  12.     }  
  13. }  

 

 

 说明:

(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.

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 出于安全和性能方面的原因怎么办 怀孕后不知道拍过好几次牙片怎么办 百度云种子含有非法离线内容怎么办 苹果手机上的迅雷怎么打不开怎么办 微信绑定银行卡收不到验证码怎么办 支付宝转账为什么没验证码怎么办 电视时间比手机慢三分钟怎么办 13岁现在有月经又流鼻血怎么办 酒店给客人把房间开错了怎么办 手机百度云下载的视频分解了怎么办 知道家人被绑架北派传销怎么办 接手前同事的客人无回复怎么办 喝了酒第二天一直吐怎么办 孩子看的鬼片不敢睡觉害怕怎么办 宝宝满月了脸还有点黄怎么办 我情人天天说没时间出去该怎么办 两个月宝宝下体三角区肿了怎么办 夏养的龙猫家里有味怎么办 不小心踩到仓鼠吐血了怎么办 不小心踩到仓鼠的头怎么办 母仓鼠生完孩子特别暴躁怎么办 被仓鼠咬出血怎么办要不要打针 被小仓鼠咬出血了该怎么办 仓鼠咬破手指流血了该怎么办 小仓鼠的手被棉花丝绑住了怎么办 荷兰猪如果不小心撞流血了怎么办 帮同事刷杯子但把杯子弄坏了怎么办 贵宾犬喜欢张开嘴巴跟人玩怎么办 鼻烟放了几天感觉跟受潮一样怎么办 两个月宝宝鼻屎堵住鼻子怎么办 肉包着智齿怎么办洗燥电影完整版 大腿内侧突然长黑痣越来越大怎么办 肚脐发炎、不脱落怎么办_妈网百科 老公出轨找个按摩的还不离婚怎么办 别人拿错钥匙装修好了房子怎么办 撞车后对方全责却不赔钱怎么办 我的世界国服客户端都是英文怎么办 下载的3d模型没有材质怎么办 写字时习惯把本子放歪该怎么办 被蚊子咬后留下硬疙瘩怎么办 吃冰镇西瓜导致呼吸不顺怎么办