Hibernate的ID生成策略

1.介紹html

Hibernate是目前最爲經常使用的ORM框架,固然也有人會選擇iBATIS或者其餘的架構.這裏咱們着重講Hibernate的ID生成策略java

 

2.可選的ID策略生成方式數據庫

 

(1)native/auto架構

根據不一樣的數據庫採用不一樣的ID生成方式,例如:在SQL Server中採用identity; 在MySQL中採用auto_increment; 在ORACLE中就會採用sequence, 注意hibernate會自動幫你建立一個名字叫hibernate_sequence的序列,不用本身去建立.這也是最經常使用和省事的.oracle

 

例子:採用xml方式配置app

 

<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)ide

@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)ui

@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)this

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

相關文章
相關標籤/搜索