hibernate学习②:hibernate的主键生成器

一、 hibernate的主键生成器:

1、会话session测试

package com.zking.two.util;
/**
 * 1、方便获取session会话,用来操作数据库
 * 2、用来检验所有映射的配置文件配置是否准确
 * @author Administrator
 *
 */


import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class SessionFactoryUtils {
	private static SessionFactory sessionFactory;
	static {
		Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
		sessionFactory = cfg.buildSessionFactory();
	}
	//打开会话session
	public static Session getSession() {
		//创建一个会话
		Session session  = sessionFactory.getCurrentSession();
		//如果session为空的话
		if(session == null) {
			//则打开一个会话
			session = sessionFactory.openSession();
		}
		//最后返回本地会话
		return session;
	}
	//关闭会话session
	public static void closeSession() {
		Session session = sessionFactory.getCurrentSession();
		//如果会话不为空且是打开的
		if(session != null && session.isOpen()) {
			//就关闭会话
			session.close();
		}
	}
	
	
}

说明:
在这里插入图片描述

在这里插入图片描述

解决:
在这里插入图片描述

2、数据库方言替换
在这里插入图片描述

3、 主键生成器:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
    	<class table = "t_hibernate_student" name = "com.zking.two.entity.Student">
    		<id name = "sid" type = "java.lang.Integer" column = "sid">
				<!-- assigned  mysql程序员自己控制 -->
				<!-- <generator class="assigned"></generator> -->
				
				<!-- identity  mysql数据库控制【数字类型    标识列自动增长】 -->
				<!-- <generator class="identity"></generator> -->
				
				<!-- sequence oracle数据库控制【标识列自动增长】-->
				<!-- <generator class="sequence">
					<param name = "sequence_name">xxxs</param>
				</generator> -->
				<!-- 实现跨数据库主键生成策略 -->
				<!-- <generator class="native"></generator> -->
				
				<!--  交给hibernate来控制主键生成-->
				<generator class="increment"></generator>
			</id>
    		<property name = "sname" type = "java.lang.String" column = "sname"></property>
    	</class>
    </hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
    	<class table = "t_hibernate_worker" name = "com.zking.two.entity.Worker">
    		<id name = "wid" type = "java.lang.String" column = "wid">
    		<!--  uuid 随机生成 -->
				<!-- <generator class="uuid"></generator> -->
			<!--   hibernate的主键生成器 [【自定义主键生成器】-->
				<generator class="com.zking.two.id.MyIdCreate"></generator> 
			</id>
    		<property name = "wname" type = "java.lang.String" column = "wname"></property>
    		
    	</class>
    </hibernate-mapping>

#####主键生成器要求
① assigned
数据类型不限、保存前必须赋值

② identity(重点掌握)
数字,无需赋值

③sequence(重点掌握)
  数字,无需赋值, 默认使hibernate_sequence这个序列,
  也可以通过sequence/sequence_name参数赋值      

4④increment
数字,无需赋值

⑤uuid/uuid.hex (是由容器自动生成的一个32位的字符串,.hex代表的是十六进制)
32位的字符串,无需赋值,

⑥ native(重点掌握)
等于identity+sequence

⑦自定义主键生成器

*.hbm.xml指定主键生成器类
      <generator class="xxx.MyTsGenerator"/> 

4、创建主键生成器类
实现org.hibernate.id.IdentifierGenerator接口即可,并还可以实现org.hibernate.id.Configurable接口来读取一些配置信息

package com.zking.two.id;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGenerator;

public class MyIdCreate implements IdentifierGenerator{

	public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {

		//公司名_模块名_时间戳
		return "zking_order"+new SimpleDateFormat("yyyy-MM-dd hh-mm-ss").format(new Date());
	}

}

dao方法:

package com.zking.two.dao;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.zking.two.entity.Student;
import com.zking.two.entity.Worker;
import com.zking.two.util.SessionFactoryUtils;

public class IdentifierDao {
	public Integer addStudent(Student student) {
		Session session = SessionFactoryUtils.getSession();
		Transaction transaction = session.beginTransaction();
//		save方法返回序列化接口,可以强制装换为id对应的类型
		Integer sid = (Integer) session.save(student);
		transaction.commit();
		session.close();
		return sid;
	}
	
	public String addWorker(Worker worker) {
		Session session = SessionFactoryUtils.getSession();
		Transaction transaction = session.beginTransaction();
//		save方法返回序列化接口,可以强制装换为id对应的类型
		String wid = (String) session.save(worker);
		transaction.commit();
		session.close();
		return wid;
	}
	
}

猜你喜欢

转载自blog.csdn.net/weixin_43163062/article/details/83244948