1. hibernate的主键生成器:

   generator元素:表示了一个主键生成器,它用来为持久化类实例生成唯一的标识 。

 

  1.1 程序员自己控制:assigned   数据类型不限、保存前必须赋值

 

  1.2 数据库控制: identity(标识列/自动增长) sequence(序列)   数字,无需赋值

 

  1.3 hibernate控制:increment uuid/uuid.hex  

 

  1.4 其它:native

 

2.SessionFactoryUtil类  作为HIbernate的帮助类(自己写)

private 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();
}
/**
* @Description: 获取session会话
* @Param: []
* @return: org.hibernate.Session
* @Author: hw
* @Date: 2018/11/20
*/
public static Session getSession() {
Session session = threadLocal.get();
if (null == session) {
session = sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
/**
* @Description: 关闭资源
* @Param: []
* @return: void
* @Author: hw
* @Date: 2018/11/20
*/
public static void closeSession() {
Session session = threadLocal.get();
if (null != session) {
if (session.isOpen()) {
session.close();
}
threadLocal.set(null);
}
}

在实体类的映射文件中,如果设置generator 的calss为increment则为自动增长

uuid则为生成随机数  assigned   为程序员输入   在企业开发中主键一般设置为varchar,

生成规则:小项目用uuid  大项目用  公司名_模块名_时间戳   

为了防止重复也可以用uui加上系统当前时间

<id name="sid" type="java.lang.Integer" column="sid">
    <generator class="increment" />
</id>

 

自动生成主键类

public class HibernateId implements IdentifierGenerator {
@Override
public Serializable generate(SharedSessionContractImplementor session, Object o) throws HibernateException {
AbstractEntityPersister persister = (AbstractEntityPersister) session.getFactory().getClassMetadata(o.getClass());
//persister.getTableName()获取表名 后面是系统当前时间
return persister.getTableName() + new SimpleDateFormat("YYYY-MM-DD HH:MM:SS").format(new Date());
}
}