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>