Hibernate 部分主键生成策略详解:
主键由程序员自主控制生成,在你使用会话操作数据库之前必须指定,与hibernate和底层数据库均无关联 。
- assigned
- <!-- name:类属性 type:类属性类型 column:对应的表列字段 -->
- <id name="sid" type="java.lang.Integer" column="sid">
- <!-- 配置数据库表的主键生成策略 -->
- <generator class="assigned"></generator>
- </id>
特点:可跨数据库,手动设置主键值
2. identity(标识列/自动增长)
主键由数据库自己控制,但这个主键必须设置为自增长,使用identity的前提条件是底层数据库支持自动增长字段类型,如DB2、SQL Server、MySQL、Sybase和HypersonicSQL等,Oracle这类没有自增字段的则不支持。
- <id name="sid" type="java.lang.Integer" column="sid">
- <!-- 配置数据库表的主键生成策略 -->
- <generator class="identity"></generator>
- </id>
特点:只能在设置了字段自增长的数据库中使用
3. sequence(序列)
主键由数据库自己控制,采用数据库提供的sequence机制生成主键,需要数据库支持sequence。如oralce、DB、SAP DB、PostgerSQL、McKoi中的sequence。MySQL这种不支持sequence的数据库则不行(可以使用identity)。
- <generator class="sequence"></generator>
特点:只能在支持序列机制的数据库中使用
4. increment (自增长)
主键由hibernate框架控制,hibernate从数据库中取出主键的最大值(每个session只取1次),以该值为基础,每次增量为1,在内存中生成主键,不依赖于底层的数据库,可跨数据库。
- <generator class="increment"></generator>
特点:可跨数据库,适合单一进程访问数据库
5. uuid
主键由hibernate框架控制,UUID:Universally Unique Identifier, 字段唯一标识值,它可以保证每台机器生成时同一时间的唯一。
- <!-- name:类属性 type:类属性类型 column:对应的表列字段 -->
- <id name="wid" type="java.lang.String" column="wid">
- <!-- 配置数据库表的主键生成策略 -->
- <generator class="uuid"></generator>
- </id>
特点:可跨数据库,效率高且能保证字段值的唯一
6. native
由hibernate根据使用的数据库自行判断采用identity、sequence其中一种作为主键生成方式,灵活性很强。
- <generator class="native"></generator>
特点:根据hibernate方言的自动选择主键的生成策略
7. 自定义主键生成器
由开发人员自主编写主键生成的字段,通过实现org.hibernate.id.IdentifierGenerator编写生成器,class里头填写全限定名
- <generator class="com.practice.factory.IdFactory"></generator>
编写的自定义主键生成器
package com.practice.factory;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGenerator;
public class IdFactory implements IdentifierGenerator {
@Override
public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
return "MySelf_create_id_" + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
}
}
骚年,去感受它的特点吧!!