hibernate id 生成策略

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

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
原创粉丝点击