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