一、 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;
}
}