Hiberbate 主键生成策略

Hibernate 中主键有:assigned, identity,sequence,increment,uuid,native,guid

Assigned:

这个主键是由外部程序负责生成,可以跨数据,就是在存储对象前,必须给对象赋值。

Identity:

使用时数据库的主键必须设为自动增长列,不然就会报错,使用时,数据库必须是支持自动增长列字段类型,比如,DB2,Server, MYSQL,Mybase,Oracle这类没有自动增长列,所以不支持。

Sequence:

使用sequence生成主键,需要数据库支持sequence,跟Identity一样,Oracle不支持。

increment:

取数据库中取出主键的最大值,

UUID:

在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。

NAtive:

根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个;

也就是说,主键生成,由hibernate选择。

GUID:

GUID的主要目的是产生完全唯一的数字。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。随机生成两个相同GUID的可能性是非常小的,但并不为0。所以,用于生成GUID的算法通常都加入了非随机的参数(如时间),以保证这种重复的情况不会发生。​​​​​​​

2 自定义生成策略:

 

package com.zking.greander;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGenerator;

public class MyCreastere implements IdentifierGenerator{

	@Override
	public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
		SimpleDateFormat sdf=new SimpleDateFormat("yyy-MM-dd-hh-mm-ss");
		String today=sdf.format(new Date());
		String s="Evan&";
		Connection connection=session.connection();
		PreparedStatement ps;
		try {
			ps=connection.prepareStatement("SELECT * FROM t_users LIMIT 1");
			ResultSet rs=ps.executeQuery();
			if(rs.next()) {
				String str=rs.getString("uid");
				return s+today+"@"+str;
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return null;
	}

}

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-9-4 23:30:20 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.zking.entity.Users" table="t_users">
        <id name="uid" type="java.lang.String">
            <column name="uid" />
            <!-- 自定义类的全权限定名 -->
            <generator class="com.zking.greander.MyCreastere"></generator>
        </id>
        <property name="uname" type="java.lang.String">
            <column name="uname" />
        </property>
        <property name="upwd" type="java.lang.String">
            <column name="upwd" />
        </property>
    </class>
</hibernate-mapping>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值