Hibernate之主键生成策略

本文详细介绍了Hibernate框架中主键生成的各种策略,包括程序员自定义、数据库控制、Hibernate控制及自定义生成器,通过实例展示了不同场景下主键生成的具体应用。

今天我们来学习Hibernate之主键生成策略
基本可以分为:
1.程序员自己控制主键
2.数据库控制设置自增长
3.Hibernate控制的主键

准备文件

SessionFactoryUtils工具类:

package com.chenkang.two.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
 * 仅在学习hibernate的工程中使用,当进入spring的学习之后有ssh来替代
 * @author Administrator
 *作用:
 *用来检测hibernate的配置文件的准确性
 * hibernate.cfg.xml
 * *.hbm.xml
 */
public class SessionFactoryUtils {
	private static SessionFactory sessionFactory;
	static {
		Configuration cfg = new Configuration().configure("/hibernate.cfg.xml");
		sessionFactory = cfg.buildSessionFactory();
	}
	
	public static Session openSession() {
//		从本地的线程中获取session会话,第一次获取不到的,那么需要sessionFactory创建一个出来
//		第二次就能够对第一次创建的session反复利用节约性能
		Session session = sessionFactory.getCurrentSession();
		if(session == null) {
			session = sessionFactory.openSession();
		}
		return session;
	}
	
	public static void closeSession() {
		Session session = sessionFactory.getCurrentSession();
		if(session != null && session.isOpen()) {
			session.close();
		}
	}
	
	public static void main(String[] args) {
		Session session = SessionFactoryUtils.openSession();
		session.beginTransaction();
		System.out.println(session.isConnected());
		SessionFactoryUtils.closeSession();
		System.out.println(session.isConnected());
	}
}

Student.hbm.xml:

<?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 name="com.chenkang.two.entity.Student" table="t_hibernate_student">
		<id name="sid" type="java.lang.Integer" column="sid">
			<!-- <generator class="assigned" /> -->
			<!-- <generator class="identity" /> -->
			 <generator class="increment" />
			<!-- <generator class="sequence" /> -->
			<!-- <generator class="sequence" > <param name="sequence_name">aaa</param> 
				</generator> -->
			<!-- <generator class="com.javaxl.two.id.Myts" /> -->
		</id>
		<property name="sname" type="java.lang.String" column="sname">
		</property>
	</class>
</hibernate-mapping>

Worker.hbm.xml:

<?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 name="com.chenkang.two.entity.Worker" table="t_hibernate_worker">
		<id name="wid" type="java.lang.String" column="wid">
		<!-- 	<generator class="assigned" /> -->
			<generator class="com.chenkang.two.id.MyTsGenerator" />
			<!-- <generator class="sequence" /> -->
			<!-- <generator class="sequence" > <param name="sequence_name">aaa</param> 
				</generator> -->
			<!-- <generator class="com.javaxl.two.id.Myts" /> -->
		</id>

		<property name="wname" type="java.lang.String" column="wname">
		</property>
	</class>
</hibernate-mapping>

DemoDao

package com.chenkang.two.dao;

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

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

/**
 * hibernate的主键生成策略 1.人工控制 2.数据库控制 3.hibernate控制 4.自定义主键生成策略
 * 
 * @author Administrator
 *
 */
public class DemoDao {
	/**
	 * 新增学生
	 * 
	 * @param stu
	 */
	public void addStudent(Student stu) {
		Session session = SessionFactoryUtils.openSession();
		Transaction transaction = session.beginTransaction();
		session.save(stu);
		transaction.commit();
		SessionFactoryUtils.closeSession();
	}

	/**
	 * 新增工人
	 * 
	 * @param worker
	 */
	public void addWorker(Worker worker) {
		Session session = SessionFactoryUtils.openSession();
		Transaction transaction = session.beginTransaction();
		session.save(worker);
		transaction.commit();
		SessionFactoryUtils.closeSession();
	}

t_hibernate_student:
在这里插入图片描述
t_hibernate_worker:
在这里插入图片描述

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

需要id赋值

public static void main(String[] args) {
		DemoDao dao = new DemoDao();
		Student stu = new Student();
		stu.setSname("陈康");
		stu.setSid(80);
		dao.addStudent(stu);

配置文件:

<?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 name="com.chenkang.two.entity.Student" table="t_hibernate_student">
		<id name="sid" type="java.lang.Integer" column="sid">
			<generator class="assigned" /> 
			<!-- <generator class="identity" /> -->
			<!--  <generator class="increment" /> -->
			<!-- <generator class="sequence" /> -->
			<!-- <generator class="sequence" > <param name="sequence_name">aaa</param> 
				</generator> -->
			<!-- <generator class="com.javaxl.two.id.Myts" /> -->
		</id>
		<property name="sname" type="java.lang.String" column="sname">
		</property>
	</class>
</hibernate-mapping>

运行结果:
在这里插入图片描述

identity(数据库控制) 数字,无需赋值

不需要id赋值!!

public static void main(String[] args) {
		DemoDao dao = new DemoDao();
		Student stu = new Student();
		stu.setSname("陈康555555");
		dao.addStudent(stu);
	}

配置文件:

<?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 name="com.chenkang.two.entity.Student" table="t_hibernate_student">
		<id name="sid" type="java.lang.Integer" column="sid">
			<!-- <generator class="assigned" />  -->
			 <generator class="identity" /> 
			<!--  <generator class="increment" /> -->
			<!-- <generator class="sequence" /> -->
			<!-- <generator class="sequence" > <param name="sequence_name">aaa</param> 
				</generator> -->
			<!-- <generator class="com.javaxl.two.id.Myts" /> -->
		</id>
		<property name="sname" type="java.lang.String" column="sname">
		</property>
	</class>
</hibernate-mapping>

运行结果:

在这里插入图片描述

hibernate控制

hibernate控制也不需要赋值id也能够加入数据库!

public static void main(String[] args) {
		DemoDao dao = new DemoDao();
		Student stu = new Student();
		stu.setSname("陈康88888888");
		dao.addStudent(stu);
	}

配置文件:

<?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 name="com.chenkang.two.entity.Student" table="t_hibernate_student">
		<id name="sid" type="java.lang.Integer" column="sid">
			<!-- <generator class="assigned" />  -->
			 <!-- <generator class="identity" />  -->
			 <generator class="increment" /> 
			<!-- <generator class="sequence" /> -->
			<!-- <generator class="sequence" > <param name="sequence_name">aaa</param> 
				</generator> -->
			<!-- <generator class="com.javaxl.two.id.Myts" /> -->
		</id>
		<property name="sname" type="java.lang.String" column="sname">
		</property>
	</class>
</hibernate-mapping>

运行结果:
在这里插入图片描述
前面讲的是主键是在为int的 情况下下面我们来讲主键是字符串的情况下:
32位的字符串,无需赋值

是由容器自动生成的一个32位的字符串

主要用在主键为字符串的情况下:

public static void main(String[] args) {
		DemoDao dao = new DemoDao();
		Worker worker = new Worker();
		worker.setWname("chenkang9999999999999");
		dao.addWorker(worker);
	}

配置文件:

<?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 name="com.chenkang.two.entity.Worker" table="t_hibernate_worker">
		<id name="wid" type="java.lang.String" column="wid">
			<generator class="uuid" />
			<!-- <generator class="com.chenkang.two.id.MyTsGenerator" /> -->
			<!-- <generator class="sequence" /> -->
			<!-- <generator class="sequence" > <param name="sequence_name">aaa</param> 
				</generator> -->
			<!-- <generator class="com.javaxl.two.id.Myts" /> -->
		</id>

		<property name="wname" type="java.lang.String" column="wname">
		</property>
	</class>
</hibernate-mapping>

运行结果:
在这里插入图片描述

自定义增长类 native

字符,无赋值

主键为字符可使用
首先建立一个包并且继承 IdentifierGenerator 接口


    package com.chenkang.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 MyTsGenerator implements IdentifierGenerator {

	@Override
	public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		return "bool_order_"+sdf.format(new Date());
	}

}


配置文件

<?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 name="com.chenkang.two.entity.Worker" table="t_hibernate_worker">
		<id name="wid" type="java.lang.String" column="wid">
			<!-- <generator class="uuid" /> -->
			<generator class="com.chenkang.two.id.MyTsGenerator" /> 
			<!-- <generator class="sequence" /> -->
			<!-- <generator class="sequence" > <param name="sequence_name">aaa</param> 
				</generator> -->
			<!-- <generator class="com.javaxl.two.id.Myts" /> -->
		</id>

		<property name="wname" type="java.lang.String" column="wname">
		</property>
	</class>
</hibernate-mapping>

运行结果:
在这里插入图片描述

总结

主键生成有多种方法,当然做项目的话肯定只会用到一两种而已

比如:
程序员自己赋值
自定义主键增长类

本 PPT 介绍了制药厂房中供配电系统的总体概念与设计要点,内容包括: 洁净厂房的特点及其对供配电系统的特殊要求; 供配电设计的一般原则与依据的国家/行业标准; 从上级电网到工厂变电所、终端配电的总体结构与模块化设计思路; 供配电范围:动力配电、照明、通讯、接地、防雷与消防等; 动力配电中电压等级、接地系统形式(如 TN-S)、负荷等级与可靠性、UPS 配置等; 照明的电源方式、光源选择、安装方式、应急与备用照明要求; 通讯系统、监控系统在生产管理与消防中的作用; 接地与等电位连接、防雷等级与防雷措施; 消防设施及其专用供电(消防泵、排烟风机、消防控制室、应急照明等); 常见高压柜、动力柜、照明箱等配电设备案例及部分设计图纸示意; 公司已完成的典型项目案例。 1. 工程背景与总体框架 所属领域:制药厂房工程的公用工程系统,其中本 PPT 聚焦于供配电系统。 放在整个公用工程中的位置:与给排水、纯化水/注射用水、气体与热力、暖通空调、自动化控制等系统并列。 2. Part 01 供配电概述 2.1 洁净厂房的特点 空间密闭,结构复杂、走向曲折; 单相设备、仪器种类多,工艺设备昂贵、精密; 装修材料与工艺材料种类多,对尘埃、静电等更敏感。 这些特点决定了:供配电系统要安全可靠、减少积尘、便于清洁和维护。 2.2 供配电总则 供配电设计应满足: 可靠、经济、适用; 保障人身与财产安全; 便于安装与维护; 采用技术先进的设备与方案。 2.3 设计依据与规范 引用了大量俄语标准(ГОСТ、СНиП、SanPiN 等)以及国家、行业和地方规范,作为设计的法规基础文件,包括: 电气设备、接线、接地、电气安全; 建筑物电气装置、照明标准; 卫生与安全相关规范等。 3. Part 02 供配电总览 从电源系统整体结构进行总览: 上级:地方电网; 工厂变电所(10kV 配电装置、变压
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值