【hibernate框架8】uuid與native生成ID的樣例-XML配置

native算法生成隨機id:

native
根據底層數據庫的能力選擇 identity、sequence 或者 hilo 中的一個。


native算法指定的字段類型:
用mysql,你需要設置主鍵bigint, autoincreament (大數,自增)
用oracle,你需要設置主鍵bigint, sequence 
這樣才能在hibernate中指定native


Student:
 

package cn.edu.hpu.model;
 
 
public class Student {
	private int id;
	private String name;
	private int age;
	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;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	
}

配置文件Student.hbm.xml:

<?xml version="1.0"?>
<!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.edu.hpu.model">
    <class name="Student" table="stu">
		<id name="id">
			<!--指定uuid算法來讓hibernate自動生成id值放入數據庫中-->
			<generator class="native"></generator>
		</id>
        <property name="name"></property>
        <property name="age"></property>
    </class>
</hibernate-mapping>

hibernate.cfg.xml中加:
 <mapping resource="cn/edu/hpu/model/Student.hbm.xml"/>


測試類:

package cn.edu.hpu.test;
 
 
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
 
 
import cn.edu.hpu.model.Student;
 
 
public class StudentTest {
	public static void main(String[] args) {
		Student s=new Student();
		s.setId(12);
		s.setName("s1");
		s.setAge(1);
		
		Configuration cfg=new Configuration();
		SessionFactory sf=cfg.configure().buildSessionFactory();
		
		Session session=sf.openSession();//得到session
		session.beginTransaction();
		session.save(s);
		session.getTransaction().commit();
		session.close();
		sf.close();
		
	}
}

運行測試類後,控制檯打出sql語句:
Hibernate: 
    insert 
    into
        stu
        (name, age, id) 
    values
        (?, ?, ?)
數據庫生成數據
生成的id:1(如果再加數據,ID自增爲2)
原理:
native根據底層數據庫的能力選擇 identity、sequence 或者 hilo 中的一個:


1.identity
對 DB2,MySQL,MS SQL Server,Sybase 和 HypersonicSQL 的內置標識字段提供支持。返回的標識符是 long,short 或者 int 類型的。


2.sequence
在 DB2,PostgreSQL,Oracle,SAP DB,McKoi 中使用序列(sequence), 而在 Interbase 中使用生成器(generator)。返回的標識符是 long,short 或者 int 類型的。


3.hilo
使用一個高/低位算法高效的生成 long,short 或者 int 類型的標識符。給定一個表和字段(默認分別是 hibernate_unique_key 和 next_hi)作爲高位值的來源。高/低位算法生成的標識符只在一個特定的數據庫中是唯一的。


uuid算法生成隨機id:

uuid算法指定的字段類型必須是String類型。


Student:
 

package cn.edu.hpu.model;
 
 
public class Student {
	private String id;
	private String name;
	private int age;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	
}

配置文件Student.hbm.xml:

<?xml version="1.0"?>
<!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.edu.hpu.model">
    <class name="Student" table="stu">
		<id name="id">
			<!--指定uuid算法來讓hibernate自動生成id值放入數據庫中-->
			<generator class="uuid"></generator>
		</id>
        <property name="name"></property>
        <property name="age"></property>
    </class>
</hibernate-mapping>

hibernate.cfg.xml中加:
 <mapping resource="cn/edu/hpu/model/Student.hbm.xml"/>


測試類:

package cn.edu.hpu.test;
 
 
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
 
 
import cn.edu.hpu.model.Student;
 
 
public class StudentTest {
	public static void main(String[] args) {
		Student s=new Student();
		s.setId("10");
		s.setName("s1");
		s.setAge(1);
		
		Configuration cfg=new Configuration();
		SessionFactory sf=cfg.configure().buildSessionFactory();
		
		Session session=sf.openSession();//得到session
		session.beginTransaction();
		session.save(s);
		session.getTransaction().commit();
		session.close();
		sf.close();
		
	}
}

運行測試類後,控制檯打出sql語句:
Hibernate: 
    insert 
    into
        stu
        (name, age, id) 
    values
        (?, ?, ?)
數據庫生成數據
生成的id:402881eb4a0f542a014a0f542ae10000
這就是uuid算法生成的id值,裏面包含:IP 地址、JVM 的啓動時間(精確到 1/4 秒)、系統時間和一個計數器值(在 JVM 中唯一)。
 

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