Hibernate 學習(三)Hibernate主鍵生成策略

生成主鍵的幾種形式

通過JPA的策略生成器來進行生成:JPA hibernate 其他的ORM框架照樣支持
GenerationType.TABLE,SEQUENCE
Hiberante : foriegn uuid
自定義主鍵生成方式

TABLE緩存主鍵生成器
@TableGenerator(name = “pk_gen”,
table=”tb_generator”,
pkColumnName=”gen_name”,
valueColumnName=”gen_value”,
pkColumnValue=”STUDENT_PK”,
allocationSize=1
)

CREATE TABLE tb_generator (
gen_name VARCHAR2(255) NOT NULL,
gen_value NUMBER NOT NULL,
PRIMARY KEY(gen_name)
)

SEQUENCE生成器
@SequenceGenerator(name=”seq_studnet”, sequenceName=”seq_payment”)

IDENTITY主鍵生成器:mysql mmsql
@GeneratedValue(strategy = GenerationType.IDENTITY)

AUTO:主鍵生成器:根據宿主數據庫進行選擇 如果是mysql 自動增長 如果是oracle sequence
@GeneratedValue(strategy = GenerationType.AUTO)

hibernate自己提供的豐富的主鍵生成策略:
assigned手動指派
@GenericGenerator(name = “studentgenerator”, strategy = “assigned”)
sequence
@GenericGenerator(name = “studentgenerator”, strategy = “sequence”,
parameters = { @Parameter(name = “sequence”, value = “seq_Student”) })

native:對於 oracle 採用 Sequence 方式,對於MySQL 和 SQL Server 採用identity(自增主鍵生成機制)
@GeneratedValue(generator = “studentgenerator”)
@GenericGenerator(name = “studentgenerator”, strategy = “native”)

identity:mysql sqlserver Oracle 不支持自增字段

uuid: 採用128位的uuid算法生成主鍵,uuid被編碼爲一個32位16進制數字的字符串。佔用空間大(字符串類型)
@GeneratedValue(generator = “studentgenerator”)
@GenericGenerator(name = “studentgenerator”, strategy = “uuid”)

foreign:外鍵
@GeneratedValue(generator = “idGenerator”)

@GenericGenerator(name = “idGenerator”, strategy = “foreign”,
parameters = { @Parameter(name = “empid”, value = “employee”) })

很少用的算法 :瞭解即可
hilo:使用hilo生成策略,要在數據庫中建立一張額外的表 使用高地位算法
@GeneratedValue(generator = “studentgenerator”)
@GenericGenerator(name = “studentgenerator”, strategy = “hilo”)
increment:hibernate 自增長,多線程不適合
@GeneratedValue(generator = “studentgenerator”)
@GenericGenerator(name = “studentgenerator”, strategy = “increment”)
guid:採用數據庫底層的guid算法機制

1.默認形式

@Entity
@Table(name="TB_STUDENT")
public class Student {
    //@Id用來標識主屬性列
    @Id
    private Long id;

主鍵id未配置默認的,在使用的時候需要手動指定主鍵的值。

public class FirstTest {
    public static void main(String[] args) {        
        Session session = HibernateUtil.getSessionFactory().openSession();
        Student s = new Student();
        s.setName("lily");
        session.save(s);
        session.close();        
    }
}

並未指定id值,看控制檯打印消息:
這裏寫圖片描述
從控制檯中可以看出,使用默認的主鍵生成策略需要手動去添加主鍵的值。

Student s = new Student();
s.setId(1l);
s.setName("lily");

這裏寫圖片描述
並未提交事物,所以數據庫方面不會有操作,此時以及沒有了語法錯誤。

TableGenerator

@Entity
@Table(name="TB_STUDENT")
@TableGenerator(name = "pk_gen",  
table="tb_generator",  
pkColumnName="gen_name",  
valueColumnName="gen_value",  
pkColumnValue="STUDENT_PK",  
allocationSize=1  
)
public class StudentTwo {
    //@Id用來標識主屬性列
    @Id
    @GeneratedValue(strategy=GenerationType.TABLE,generator="pk_gen")
    private Long id;
    private String name;

控制檯打印的消息:

五月 14, 2017 11:32:06 上午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000232: Schema update complete
Hibernate: 
    select
        gen_value 
    from
        tb_generator 
    where
        gen_name = 'STUDENT_PK' for update

Hibernate: 
    insert 
    into
        tb_generator
        (gen_name, gen_value) 
    values
        ('STUDENT_PK', ?)
Hibernate: 
    update
        tb_generator 
    set
        gen_value = ? 
    where
        gen_value = ? 
        and gen_name = 'STUDENT_PK'
Hibernate: 
    select
        gen_value 
    from
        tb_generator 
    where
        gen_name = 'STUDENT_PK' for update

Hibernate: 
    update
        tb_generator 
    set
        gen_value = ? 
    where
        gen_value = ? 
        and gen_name = 'STUDENT_PK'

數據庫中生成了一張管理主鍵值的表
這裏寫圖片描述

AUTO:主鍵生成器

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id;

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章