1. 程式人生 > >Hibernate 主鍵生成策略

Hibernate 主鍵生成策略

關閉 min conn mine 數據 xml文件 ive orm 刪除

第一步:引入jar包 省略

第二部:創建實體類

package cn.hibernate.bean;

public class Student {

private Integer sId;
private String sName;
public Integer getsId() {
return sId;
}
public void setsId(Integer sId) {
this.sId = sId;
}
public String getsName() {
return sName;
}
public void setsName(String sName) {
this.sName = sName;


}
public Student(Integer sId, String sName) {
super();
this.sId = sId;
this.sName = sName;
}
public Student() {
super();
}
@Override
public String toString() {
return "Student [sId=" + sId + ", sName=" + sName + "]";
}

}

第三步:創建映射文件 Student.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.hibernate.bean">
<class name="Student">
<id name="sId">
<!--
主鍵生成策略
* 整形 :int/short/long

1.increment:hiernate自動維護表中的主鍵,先進行查詢max(id),然後最大值+1,執行insert語句
存在並發問題,不建議使用
2.identity,hibernate采用數據庫底層的自動正常。例如:mysql ## auto_increment修飾主鍵
數據庫的表結構中存在“AUTO——increment=5”進行記錄
3.sequence,hibernate采用數據庫底層的序列。例如:oracle
oracle:不支持自動增強,但支持序列
4.hilo,hibernate將采用高低位算法(high/low)適用於不知此自動增長和序列的數據(了解即可)
思想:采用另一張表記錄累加數據
<generator class="hilo">
<param name="table">hi_value</param> hi_value 另一張表的表明
<param name="column">next_value</param> next_value 另一張表的字段名
<param name="max_lo">100</param> 一次操作支持的最大操作並發數。
</generator>
批量第一個值:max_lo * next_value + next_value
100 6 + 6
5.native:從identity、sequence、hilo 三選一,根據數據庫決定
###以上的類型都是整形
6.UUID,類型必須字符串
以上策略:hibernate自動生成:代理主鍵
7.assigned:自然主鍵,程序自己設置。
-->
<generator class="assigned">
</generator>
</id>
<property name="sName"></property>
</class>
</hibernate-mapping>

第四步:創建hibernate.cfg.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- #1 基本的四項
property.name 取值如果以‘hibernate’開頭,可以省略
以“hibernate.connection.driver_class”與“connection.driver_class”相同
-->
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/minemysql
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>

<!-- #2方言 -->
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>


<!-- #3 sql -->
<!-- 是否顯示sql語句 -->
<property name="hibernate.show_sql">true</property>
<!-- 是否格式化sql語句 不格式化顯示一行 格式化顯示多行 -->
<property name="hibernate.format_sql">true</property>
<!-- 是否顯示註釋,提供當前sql語句操作對象 -->
<property name="hibernate.use_sql_comments">true</property>


<!-- #4如何創建表(不重要)
create:每一次加載cfg.xml文件都將創建表,程序關閉時,表不進行刪除 [初始化,測試時使用]
如果表存在則先刪除後創建
create-drop:每一次加載cfg.xml文件都將創建表,程序關閉時,表進行刪除
必須執行factory.close()才能刪除
update:如果表不存在則創建,如果表存在,先回檢查*.hbm.xml文件是否和表匹配,
如果不匹配將更新表結構(只添加,不刪除)
validate:加載cfg.xml進效驗,映射文件和數據表是否匹配,如果匹配正常操作,如果不匹配則拋出異常
### 顯示的開發中先有的表,再有的映射文件
* 表 由DBA創建
-->
<property name="hibernate.hbm2ddl.auto">update</property>


<!-- #5取消bean效驗 -->
<property name="javax.persistence.validation.mode">none</property>
</session-factory>
</hibernate-configuration>

第五步:創建測試類

package cn.hibernate.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import cn.hibernate.bean.Student;

public class TestStu {

private SessionFactory factory = new Configuration().configure().addClass(Student.class).buildSessionFactory();

@Test
public void demo01(){
/*
* 測試主鍵生成策略中的 increment
* */

Session session = factory.openSession();
session.beginTransaction();

Student stu = new Student();
stu.setsName("哈哈");
session.save(stu);
session.getTransaction().commit();
session.close();

//執行的語句
/*Hibernate:
select
max(sId)
from
Student
Hibernate:
insert cn.hibernate.bean.Student
insert
into
Student
(sName, sId)
values
(?, ?)*/



}


@Test
public void demo02(){
/*
* 測試主鍵生成策略中的 identity
* */

Session session = factory.openSession();
session.beginTransaction();

Student stu = new Student();
stu.setsName("哈哈1");
session.save(stu);
session.getTransaction().commit();
session.close();

//執行的語句
/*Hibernate:
insert cn.hibernate.bean.Student
insert
into
Student
(sName)
values
(?)
*/



}


@Test
public void demo03(){
/*
* 測試主鍵生成策略中的 hilo
* */

Session session = factory.openSession();
session.beginTransaction();

Student stu = new Student();
stu.setsName("哈哈12");
session.save(stu);

Student stu1 = new Student();
stu.setsName("哈哈13");
session.save(stu1);

Student stu2 = new Student();
stu.setsName("哈哈14");
session.save(stu2);

session.getTransaction().commit();
session.close();

}

@Test
public void demo04(){
/*
* 測試主鍵生成策略中的 UUID
* */

Session session = factory.openSession();
session.beginTransaction();

Student stu = new Student();
stu.setsName("333");
session.save(stu);

Student stu1 = new Student();
stu.setsName("222");
session.save(stu1);

Student stu2 = new Student();
stu.setsName("111");
session.save(stu2);

session.getTransaction().commit();
session.close();

}

@Test
public void demo05(){
/*
* 測試主鍵生成策略中的 assigned
* */

Session session = factory.openSession();
session.beginTransaction();

Student stu = new Student();
stu.setsId("104322-19910423-ww");
stu.setsName("333");
session.save(stu);

session.getTransaction().commit();
session.close();

}

}

Hibernate 主鍵生成策略