且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

【hibernate框架】uuid与native生成ID的样例-XML配置

更新时间:2022-04-18 04:07:11

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 中唯一)。


转载请注明出处:http://blog.csdn.net/acmman