资料:
一、主键类型:
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>