Hibernate的主键生成策略,自定义主键生成器?

本文介绍了Hibernate中的多种主键生成策略,包括assigned、identity、increment、uuid、native、guid和sequence,并探讨了如何根据数据库特性选择合适策略。此外,还详细阐述了自定义主键生成器的实现方式,通过实现IdentifierGenerator接口来优化主键生成过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

资料:

一、主键类型:

1、assigned:

数据库ID设为自动增长列时,在存储对象前,主键可手动赋值,也可不手动赋值; 不赋值执行数据库自动增长,赋值执行赋予的值(数据类型为int)。

2、identity:

数据库ID必须设置为自动增长列,不能手动赋值(数据类型必须为int类型)

3、increment:

数据库ID可不设置为自动增长列,不能手动赋值(数据类型必须为int类型);

实现原理:从数据库取出主键最大值(每个session取一次),以该值为基础,每次增量为1。

4、uuid:

数据库ID不能设置为自动增长列,不能手动赋值(数据类型必须是String类型);生成的是一个16进制的数字(不能跨数据库)。

5、native:

数据库ID必须设置为自动增长列,不能手动赋值(数据类型必须是int类型);当数据库为int类型时,最好使用主键类型为native(能够跨数据库)

6、guid:

数据库ID不能设置为自动增长列,不能手动赋值(数据类型必须是String类型);

当数据库为String类型时,最好使用主键类型为guid。

7、sequence:

采用数据库提供的sequence机制生成主键。MySql数据库不支持。(数据类型必须是int类型)。

在hibernate.xml里面设置:

		<id name="id" type="java.lang.String">
			<column name="ID" />
			<!-- 
			        <generator class="assigned" />
			        <generator class="identity" />
			        <generator class="increment" />
			        <generator class="uuid" />
			        <generator class="native" />
			        <generator class="guid" />
			        <generator class="sequence" />
			 -->
		</id>

 

二、自定义主键生成器:

创建主键生成器类,实现 org.hibernate.id.IdentifierGenerator 接口

示例1:读取数据库信息来实现自定义主键生成器(缺点:查询了数据库表中的所有数据,读取速度慢):

public class MyGenerator implements IdentifierGenerator {

	@Override
	public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session2 = sessionFactory.openSession();
		Transaction transaction = session2.beginTransaction();
		// 得到数据库集合
		List<Userinfo> lu = session2.createCriteria(Userinfo.class).list();
		String str = "";
		if (lu.size() > 0) {
			for (int i = 0; i < lu.size(); i++) {
				str = "Chain_0" + (i + 2);
			}
		} else {
			str = "Chain_01";
		}
		transaction.commit();
		session2.close();
		sessionFactory.close();
		return str;
	}

}

示例2:读取数据库信息来实现自定义主键生成器(优点:对数据库的表只查询了一次,读取速度相对于示例1较快):

public class MyGenerator3 implements IdentifierGenerator {

	@Override
	public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {

		// 定义开始字符
		String frist = "Chain_";
		// 连接对象
		Connection connection = session.connection();
		try {
			// 数据库sql语句:查询表的总数据
			PreparedStatement ps = connection.prepareStatement("SELECT COUNT(*) AS nextval FROM userinfo");
			// 返回结果集
			ResultSet rs = ps.executeQuery();
			if (rs.next()) {
				// 得到查询的值+1
				int id = rs.getInt("nextval") + 1;
				String code = frist + StringUtils.leftPad("" + id, 3, "0");
				return code;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

在hibernate.xml里面设置:

		<id name="id" type="java.lang.String">
			<column name="ID" />
			   <generator class="com.zking.hibernate02.generator.MyGenerator" />
		</id>

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值