首页 > 代码库 > Hibernate 主键生成策略

Hibernate 主键生成策略

第一步:引入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 主键生成策略