1. hibernate的主键生成器:
generator元素:表示了一个主键生成器,它用来为持久化类实例生成唯一的标识 。
<id name="sid" type="java.lang.Integer" column="sid">
<generator class="increment" />
</id>
对于其的属性有
1.1 程序员自己控制:assigned 数据类型不限、保存前必须赋值
1.2 数据库控制: identity(标识列/自动增长) sequence 数字,无需赋值(重点)
1.3 hibernate控制:increment uuid/uuid.hex/guid
(是由容器自动生成的一个32位的字符串,.hex代表的是十六进制)
32位的字符串,无需赋值,注意数据库的字段为字符串
1.4 其它:native自定义
创建主键生成器类
实现org.hibernate.id.IdentifierGenerator接口即可
/**
* 自定义主键类
*/
public class Zkingid implements IdentifierGenerator {
@Override
public Serializable generate(SharedSessionContractImplementor session, Object o) throws HibernateException {
AbstractEntityPersister classMetadata = (AbstractEntityPersister)session.getFactory().getClassMetadata(o.getClass());
System.out.println(classMetadata.getEntityName());//实体类的全路径限定名
String tableName = classMetadata.getTableName();//表名
//这里返回的就是主键
return tableName+new SimpleDateFormat("yyyy-MM-dd HH-mm-ss").format(new Date());
}
使用
<!--name为实体类属性 type为实体类的数据类型 column 数据库列名-->
<id name="wid" type="java.lang.String" column="wid">
<!--主键自定义的类-->
<generator class="com.zking.id.Zkingid" />
</id>
SessionFactoryUtils类
package com.zking.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* hibernate工具类
* @author Administrator
*
*/
public class SessionFactoryUtils {
public static SessionFactory sessionFactory;
// 存放当前会话
private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
static {
Configuration cfg = new Configuration();
Configuration configure = cfg.configure("hibernate.cfg.xml");
sessionFactory = configure.buildSessionFactory();
}
/**
*
*打开一个session会话
* @return
*/
public static Session openSession() {
Session session = threadLocal.get();
if (null == session) {
session = sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
public static void closeSession() {
Session session = threadLocal.get();
if (null != session) {
if (session.isOpen()) {
session.close();
}
threadLocal.set(null);
}
}
}