关于Hibernate的ID生成策略总结

一 使用XML映射文件生成ID的时候

    <id name="Key" column="pid" type="string">

        <generator class="uuid"/>

    </id>

Generator有四个值可选择: native, uuid, identity,sequence.

Native: id可以自增,

 

二 使用Annotation的时候生成ID

         1 @ID (设为id,一般在属性得到get方法上面,也可以在属性上面)

         2 @Generatorvalue设置ID的值,有四个值选择

                   A Generatorvalue (strategy=GenerationType.Auto)这个也是默认的值,并且这个值支持所有的数据库

                   B Generatorvalue(strategy=GenerationType.IDENTITY) 只支持在MySQL中或SQLSERVER这种支持IDENTITY的数据库中

      C Generatorvalue(strategy=GenerationType.SEQUENCE) 支持orcal数据库

      D Table的ID生成,很少用

   @javax.persistence.TableGenerator(

      name="student",

      table="GENERATOR_TABLE",

      pkColumnName = "pk_value",

      pkColumnValue = "Teacher",

      allocationSize = 1

   )

Generatorvalue(strategy=GenerationType.TABLE generator=”student”)

使用该方法可以跨数据库

 

三 联合主键

   1 在映射文件的xml中设置联合主键时:

      <composite-id name="pk" class="StudentPK">

          <key-property name="id"/>

          <key-property name="name"/>

       </composite-id>

   2 使用Annotation的时候:

      A 在创建的主键类中加@Embeddable

      @Embeddable //联合主键

public class StudentPK implements java.io.Serializable{

}

然后在主键类的属性get方法上加@ID

@Id //联合主键

      public StudentPK getPk() {

         return pk;

}

B 在主键类的属性get方法上加@EmbeddedId

@EmbeddedId //联合主键

   public StudentPK getPk() {

      return pk;

}

C

@IdClass(StudentPK.class)

public class Student {

   @Id

   public Integer getId() {

      return id;

   }

   public void setId(Integer id) {

      this.id = id;

   }

   @Basic //默认的,加不加无所谓

   @Id

   public String getName() {

      return name;

   }

   public void setName(String name) {

      this.name = name;

   }

}

 

这种方法不用new主键类

3 以上两种方法必须创建主键类,并且在主键类中实现implements java.io.Serializable 借口,因为要把主键类序列化,这样就可以一下子放在硬盘上,或通过网络传送给他人;

  并且在主键类中复写equals, hashCode 方法,因为equals确保一致性,hashCode获得hash码

 

例如

package com.bean;

 

import javax.persistence.Embeddable;

import javax.persistence.GeneratedValue;

 

//@Embeddable //联合主键

public class StudentPK implements java.io.Serializable{

   private int id;

   private String name;

   public int getId() {

      return id;

   }

   public void setId(int id) {

      this.id = id;

   }

   public String getName() {

      return name;

   }

   public void setName(String name) {

      this.name = name;

   }

   @Override

   public boolean equals(Object o){

      if(o instanceof StudentPK) {

         StudentPK pk = (StudentPK)o;

         if(this.id==pk.getId()&&this.name==pk.getName()){

            return true;

         }

      }

      return false;

   }

   @Override

   public int hashCode() {

      return this.name.hashCode();

   }

}

posted @ 2015-05-09 14:23  梅兴昊  阅读(134)  评论(0)    收藏  举报