目录
前言
之前讲了如何配置Hibernate,并且使用的完成简单的增删改查。
本章完成对数据库表的主键有多少方法生成。
基本可以分为:
- 自己定义主键
- 数据库设置自增长,序列表
- Hibernate定义主键
所以大概可以从这几个方面入手,分别来测试主键的生成
看下今天我所建的包。
准备文件
SessionFactoryUtils工具类
这个工具类就是用来测试,并且可以简化一丢丢代码。
package com.liwangwangTwo.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class SessionFactoryUtils {
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();
}
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);
}
}
public static void main(String[] args) {
Session session = openSession();
System.out.println(session.isConnected());
closeSession();
}
}
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.liwangwangTwo.entity.Student" table="t_hibernate_student">
<id name="sid" type="java.lang.Integer" column="sid">
<!-- 自己定义数据 -->
<generator class="assigned" />
<!-- 数据库定义-->
<!-- <generator class="identity" /> -->
<!-- <generator class="sequence" /> -->
<!-- <generator class="sequence" > <param name="sequence_name">aaa</param>
</generator> -->
<!-- Hibernate定义 -->
<!-- <generator class="increment" /> -->
<!-- <generator class="uuid" /> -->
<!-- 自定义主键生成器 -->
<!-- <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.liwangwangTwo.entity.Worker" table="t_hibernate_worker">
<id name="wid" type="java.lang.String" column="wid">
<!-- 自己定义数据 -->
<!-- <generator class="assigned" /> -->
<!-- 数据库定义-->
<!-- <generator class="identity" /> -->
<!-- <generator class="sequence" /> -->
<!-- <generator class="sequence" > <param name="sequence_name">aaa</param>
</generator> -->
<!-- Hibernate定义 -->
<!-- <generator class="increment" /> -->
<!-- <generator class="uuid" /> -->
<!-- 自定义主键生成器 -->
<generator class="com.liwangwangTwo.id.Myts" />
</id>
<property name="wname" type="java.lang.String" column="wname">
</property>
</class>
</hibernate-mapping>
DemoDao
package com.liwangwangTwo.DemoDao;
import java.io.Serializable;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.liwangwangTwo.entity.Student;
import com.liwangwangTwo.entity.Worker;
import com.liwangwangTwo.util.SessionFactoryUtils;
public class DemoDao {
public Serializable addStudent(Student stu) {
Session session = SessionFactoryUtils.openSession();
Transaction transaction = session.beginTransaction();
Serializable save = session.save(stu);
transaction.commit();
session.close();
return save;
}
public Serializable addWorker(Worker Worker) {
Session session = SessionFactoryUtils.openSession();
Transaction transaction = session.beginTransaction();
Serializable save = session.save(Worker);
transaction.commit();
session.close();
return save;
}
}
数据库
t_hibernate_student
t_hibernate_worker
实体类跟之前不变
自定义
assigned :自定义
数据类型不限、保存前必须赋值
比如说:
public static void testmain(String[] args) {
DemoDao dao = new DemoDao();
Student stu = new Student();
stu.setSid(1);
stu.setSname("kk");
System.out.println(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.liwangwangTwo.entity.Student" table="t_hibernate_student">
<id name="sid" type="java.lang.Integer" column="sid">
<!-- 自己定义数据 -->
<generator class="assigned" />
</id>
<property name="sname" type="java.lang.String" column="sname">
</property>
</class>
</hibernate-mapping>
数据库定义
identity : 自增长
数字,无需赋值
主要用在主键为数字的情况下
<?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.liwangwangTwo.entity.Student" table="t_hibernate_student">
<id name="sid" type="java.lang.Integer" column="sid">
<!-- 数据库定义-->
<generator class="identity" />
</id>
<property name="sname" type="java.lang.String" column="sname">
</property>
</class>
</hibernate-mapping>
使用
public static void testmain(String[] args) {
DemoDao dao = new DemoDao();
Student stu = new Student();
//stu.setSid(1);//没有定义也可以插入,因为数据库定义identity
stu.setSname("kk");
System.out.println(dao.addStudent(stu));
}
sequence :序列表
数字,无需赋值默认使hibernate_sequence这个序列
主要用在主键为数字的情况下
<?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.liwangwangTwo.entity.Student" table="t_hibernate_student">
<id name="sid" type="java.lang.Integer" column="sid">
<!-- 数据库定义-->
<generator class="sequence" /> <!-- 默认序列库表-->
<!-- <generator class="sequence" > <param name="sequence_name">aaa</param>
</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 name="com.liwangwangTwo.entity.Student" table="t_hibernate_student">
<id name="sid" type="java.lang.Integer" column="sid">
<!-- 数据库定义-->
<!--<generator class="sequence" /> -->
<generator class="sequence" > <param name="sequence_name">aaa</param>
</generator><!-- 指定序列库表-->
</id>
<property name="sname" type="java.lang.String" column="sname">
</property>
</class>
</hibernate-mapping>
使用
public static void testmain(String[] args) {
DemoDao dao = new DemoDao();
Student stu = new Student();
//stu.setSid(1);//没有定义也可以插入,因为数据库定义identity
stu.setSname("kk");
System.out.println(dao.addStudent(stu));
}
Hibernate定义
increment : Hibernate自动方法
数字,无需赋值
主要用在主键为数字的情况下
<?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.liwangwangTwo.entity.Student" table="t_hibernate_student">
<id name="sid" type="java.lang.Integer" column="sid">
<!-- Hibernate定义 -->
<generator class="increment" />
</id>
<property name="sname" type="java.lang.String" column="sname">
</property>
</class>
</hibernate-mapping>
使用
public static void testmain(String[] args) {
DemoDao dao = new DemoDao();
Student stu = new Student();
//stu.setSid(1);//没有定义也可以插入,因为Hibernate定义increment
stu.setSname("kk");
System.out.println(dao.addStudent(stu));
}
uuid : 自动拼接字符串
32位的字符串,无需赋值
是由容器自动生成的一个32位的字符串
主要用在主键为字符串的情况下
<?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.liwangwangTwo.entity.Worker" table="t_hibernate_worker">
<id name="wid" type="java.lang.String" column="wid">
<!-- Hibernate定义 -->
<generator class="uuid" />
</id>
<property name="wname" type="java.lang.String" column="wname">
</property>
</class>
</hibernate-mapping>
使用
public static void main(String[] args) {
DemoDao dao = new DemoDao();
Worker Worker = new Worker();
//不用赋值给wid
Worker.setWname("坤坤");
System.out.println(dao.addWorker(Worker));
}
结果就是这样
会自动生成一个字符串
native
等于identity+sequence
自定义增长类
字符,无赋值
主键为字符可使用
<?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.liwangwangTwo.entity.Worker" table="t_hibernate_worker">
<id name="wid" type="java.lang.String" column="wid">
<!-- 自定义主键生成器 -->
<generator class="com.liwangwangTwo.id.Myts" />
</id>
<property name="wname" type="java.lang.String" column="wname">
</property>
</class>
</hibernate-mapping>
Myts增长类
package com.liwangwangTwo.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 Myts implements IdentifierGenerator {
@Override
public Serializable generate(SharedSessionContractImplementor arg0, Object arg1) throws HibernateException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return "liwangwang_shop_book_"+sdf.format(new Date());
}
}
使用
public static void main(String[] args) {
DemoDao dao = new DemoDao();
Worker Worker = new Worker();
//不用赋值给wid
Worker.setWname("坤坤");
System.out.println(dao.addWorker(Worker));
}
结果
总结
主键生成有多种方法,当然做项目的话肯定只会用到一两种而已
比如:
自己赋值
自定义主键增长类
Thanks♪(・ω・)ノ希望对大家有所帮助