今天我们来学习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>
运行结果:

总结
主键生成有多种方法,当然做项目的话肯定只会用到一两种而已
比如:
程序员自己赋值
自定义主键增长类
本文详细介绍了Hibernate框架中主键生成的各种策略,包括程序员自定义、数据库控制、Hibernate控制及自定义生成器,通过实例展示了不同场景下主键生成的具体应用。
185

被折叠的 条评论
为什么被折叠?



