Hibernate学习笔记_ID生成策略

一,xml生成id

 

a)    generator    

<hibernate-mapping>
    <class name="com.bjsxt.hibernate.Student">
        
            
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="age" />
        <property name="sex" />
        <property name="good" type="yes_no"></property>
    </class>
    
</hibernate-mapping>

 

b)    常用四个:native identity sequence uuid(跨平台 native uuid)

native

根据底层数据库的能力选择identity,sequence 或者hilo中的一个。(数据库自增)

identity

对DB2,MySQL, MS SQL Server,Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的。 (数据库自增)

sequence

在DB2,PostgreSQL, Oracle, SAPDB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。(数据库自增)

 二,  注解方式:@GeneratedValue

 

a)   自定义ID

 

b)   AUTO(直接写 @GeneratedValue 相当如native)

 

         i.   默认:对 MySQL,使用auto_increment

        ii.   对 Oracle使用hibernate_sequence(名称固定)

   @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

 

c)   IDENTITY(@GeneratedValue(strategy=GenerationType.IDENTITY))

d)   SEQUENCE(@GeneratedValue(strategy=GenerationType.SEQUENCE))

        i.   @SequenceGenerator(可自定义在数据库生成指定的sequence名)



@Entity
@Table(name="_Teacher")
@SequenceGenerator(name="teacherSEQ",sequenceName="teacherSEQ_DB")    //"teacherSEQ"为@SequenceGenerator的标识名  ,"teacherSEQ_DB"为指定到数据库生成的Sequence名public class Teacher {
    private int id;
    private String name;
    private String title;
    private String money;
    private Date birthDay;
    private ZhiCheng zhiCheng;
    
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ")
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
............ }

 

        

e)   TABLE (可以忘记)

原理:就是在数据库中建立一个表,这个表包含两个字段,一个字段表示名称,另一个字段表示值。每次在添加数据时,使用第一个字段的名称,来取值作为添加数据的ID,然后再给这个值累加一个值再次存入数据库,以便下次取出使用。

@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//每次使用数据后累加的数值
    )


@SequenceGenerator(name="teacherSEQ",sequenceName="teacherSEQ_DB")
public class Teacher {
    private int id;
    private String name;
    private String title;
    private String money;
    private Date birthDay;
    private ZhiCheng zhiCheng;
    
    @Id
    @GeneratedValue(strategy=GenerationType.TABLE,generator="Teacher_GEN")
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
.......... }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。