码迷,mamicode.com
首页 > 其他好文 > 详细

4.ID主键生成策略

时间:2017-08-18 11:16:03      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:自增   取出   取值   ota   标签   uuid   mysq   site   sybase   

保证唯一性(auto_increment)

  一、xml方式

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 5 
 6 <hibernate-mapping package="com.bjsxt.hibernate.model">
 7     <class name="Student" table="t_student" dynamic-update="true">
 8         <id name="id" >
 9         <generator class="native"></generator>
10         </id>
11         
12         <property name="name"></property>
13     </class>
14 </hibernate-mapping>  

  <id> 标签必须配置在 <class>标签内第一个位置。由一个字段构成主键,如果是复杂主键<composite-id> 标签 

  <generator> 元素 (主键生成策略)

  如:<generator class="native"/>  根据是什么数据库,自动选择,mysql默认是 ‘identity‘ 即 auto_increment 

    <generator class="uuid "/>  用一个128-bit的UUID算法生成字符串类型的标识符 在Mysql类型是 varchar(255)

 

  二、annotation方式

  在相应的get方法上使用@GeneratedValues(strategy=GeneratedType) 

  strategy 取值:如:strategy=GenerationType.AUTO

  1.AUTO(默认值) - 可以是identity column类型,或者sequence 类型 或者 table 类型取决于不同的底层数据库 相当于 native

    1、对于mysql,使用auto_increment

    2、对于oracle使用hibernate_sequence(名称固定)

 

  2.TABLE - 使用表保存id值

    就是在数据库中建立一个表,这个表包含两个字段,一个字段表示名称,另一个字段表示值。

    每次在添加数据时,使用第一个字段的名称,来取值作为添加数据的ID,然后再给这个值累加一个值再次存入数据库,以便下次取出使用。  

  @Entity
  @javax.persistence.TableGenerator(
    name="Teacher_GEN",        //生成策略的名称
    table="GENERATOR_TABLE",    //在数据库生成表的名称
    pkColumnName = "pk_key",      //表中第一个字段的字段名 类型为varchar,key
    valueColumnName = "pk_value",   //表中第二个字段的字段名 int ,value
    pkColumnValue="teacher",      //这个策略中使用该记录的第一个字段的值(key值)
    initialValue = 1,            //这个策略中使用该记录的第二个字段的值(value值)初始化值
    allocationSize=1         //每次使用数据后累加的数值
  )
  @GeneratedValue(strategy=GenerationType.TABLE,generator="Teacher_GEN")

 

  3.IDENTITY - identity column 

    对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。

    返回的标识符是long, short 或者int类型的。 (数据库自增)

    注意:此生成策略不支持Oracle

   

  4.SEQUENCE - sequence
    在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence),

    而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。(数据库自增)
    注意:此生成策略不支持MySQL

联合主键(多个字段构成唯一性)

 1 <hibernate-mapping package="com.bjsxt.hibernate.model">
 2     <class name="Student" table="t_student">
 3         <composite-id name="pk" class="com.bjsxt.hibernate.model.StudentPK">
 4             <key-property name="id"></key-property>
 5             <key-property name="name"></key-property>
 6         </composite-id>
 7         
 8         <property name="age" />
 9         <property name="sex" />
10         <property name="good" type="yes_no"></property>
11     </class>
12 </hibernate-mapping> 

 

  1.xml方式

    a)建立复合主键类 (必须实现Serializable接口)

    b)在实体类中引用复合主键类

    c)student.hbm.xml 映射文件   

    <composite-id name="studentPK" class=>
      <key-property name="id"/>
      <key-property name="name"/>
    </composite-id>

  2.annotation方式

  三种方法:一般用  2  3

 1 @Entity
 2 @Table(name="t_teacher")
 3 /*@IdClass(TeacherPK.class)*/
 4 public class Teacher {
 5     private int id;
 6     private String name;
 7     /*private TeacherPK tfk;*/
 8 
 9     private int age;
10     private String teach;
11     private Date birthday;
12     private Gender gender;
13     /*@EmbeddedId
14     public TeacherPK getTfk() {
15         return tfk;
16     }
17     public void setTfk(TeacherPK tfk) {
18         this.tfk = tfk;
19     }*/

 

  1.将组件类(TeacherPK)注解为 @Embeddable,并将组件的属性(getTPk())注解为@Id

  2.将组件的属性 (getTPk()) 注解为 @EmbeddedId

  3.将类(Teacher)注解为@IdClass,并将该实体类中所有属于主键的属性都注解为@Id

注:不管哪种方式 联合主键类(如:Teacherpk) 需要

  1.实现  Serializable  接口

  2.需要重写equals 和 hashCode方法

    (Teacher类 存到 DB中 需要保证Teacher对象中联合主键唯一,所以需要有equals和hashCode)

4.ID主键生成策略

标签:自增   取出   取值   ota   标签   uuid   mysq   site   sybase   

原文地址:http://www.cnblogs.com/xuzekun/p/7388006.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!