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());
}
}