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算法指定的字段类型必须是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,?)
数据库生成数据
生成的id:402881eb4a0f542a014a0f542ae10000
这就是uuid算法生成的id值,里面包含:IP 地址、JVM 的启动时间(精确到 1/4 秒)、系统时间和一个计数器值(在 JVM 中唯一)。
转载请注明出处:http://blog.csdn.net/acmman