hibernate主键生成策略

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



}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值