Hibernate主键生成策略
目录:
hibernate的主键生成器
事例
1.1 程序员自己控制:assigned
1.2 数据库控制: identity(标识列/自动增长) sequence
1.3 hibernate控制:increment uuid/uuid.hex
3. 自定义主键生成器
3.1 hbm.xml指定主键生成器类 3.2 创建主键生成器类
实现org.hibernate.id.IdentifierGenerator接口即可,并还可以实现
org.hibernate.id.Configurable接口来读取一些配置信息
实体类:(Student)
package com.liuxia.two.entity;public class Student {private Integer sid;private String sname;public Integer getSid() {return sid;}public void setSid(Integer sid) {this.sid = sid;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public Student(Integer sid, String sname) {this.sid = sid;this.sname = sname;}@Overridepublic String toString() {return "Student [sid=" + sid + ", sname=" + sname + "]";}public Student() {}}
实体类的映射文件
<?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.liuxia.two.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> --><!-- <generator class="com.javaxl.two.id.Myts" /> --></id><property name="sname" type="java.lang.String" column="sname"></property></class>
</hibernate-mapping>
2.1 assigned
数据类型不限、保存前必须赋值
2.2 identity(重点掌握)
数字,无需赋值
2.3 sequence(重点掌握)
数字,无需赋值, 默认使hibernate_sequence这个序列,
也可以通过sequence/sequence_name参数赋值
2.4 increment
数字,无需赋值
2.5 uuid/uuid.hex (是由容器自动生成的一个32位的字符串,.hex代表的是十六进制)
32位的字符串,无需赋值,
2.6 native(重点掌握)
等于identity+sequence
事例
利用uuid生成主键来增加一条数据
worker实体类
package com.liuxia.two.entity;public class Worker {private String wid;private String wname;
public String getWid() {return wid;
}
public void setWid(String wid) {this.wid = wid;
}
public String getWname() {return wname;
}
public void setWname(String wname) {this.wname = wname;
}
public Worker(String wid, String wname) {super();this.wid = wid;this.wname = wname;
}public Worker() {}
@Override
public String toString() {return "Worker [wid=" + wid + ", wname=" + wname + "]";
}}
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.liuxia.two.entity.Worker" table="t_hibernate_worker"><id name="wid" type="java.lang.String" column="wid"><!-- <generator class="assigned" /> --><generator class="com.liuxia.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.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- 1. 数据库相关 --><property name="connection.username">root</property><property name="connection.password">123</property><property name="connection.url">jdbc:mysql://localhost:3306/t226_layui?useUnicode=true&characterEncoding=UTF-8</property><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="dialect">org.hibernate.dialect.MySQLDialect</property><!-- 配置本地事务(No CurrentSessionContext configured!) --><property name="hibernate.current_session_context_class">thread</property><!-- 2. 调试相关 --><property name="show_sql">true</property><property name="format_sql">true</property><!-- 3. 添加实体映射文件 --><mapping resource="com/liuxia/one/entity/User.hbm.xml" /><!-- 主键生成策略 --><mapping resource="com/liuxia/two/entity/Student.hbm.xml" /><mapping resource="com/liuxia/two/entity/Worker.hbm.xml" /></session-factory>
</hibernate-configuration>
DemoDao
package com.liuxia.two.dao;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;import com.liuxia.two.entity.Student;
import com.liuxia.two.entity.Worker;
import com.liuxia.two.util.SessionFactoryUtils;
/*** hibernate中的主键生成* 1.人工控制* 2.数据库控制* 3.hibernate控制* 4.自定义主键生成* @author 2019072303**/
public class DemoDao {/*** 新增学生* @author 2019072303**/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();}public static void testStudent() {DemoDao dao=new DemoDao();Student stu=new Student();stu.setSname("南过北风");stu.setSid(99);dao.addStudent(stu);}public static void main(String[] args) {DemoDao dao=new DemoDao();Worker worker=new Worker();worker.setWname("阿莫西林");dao.addWorker(worker);System.out.println(worker);}}
SessionFactoryUtils
package com.liuxia.two.util;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;/*** 仅在学习hibernate的工程中使用,当选入spring的学习后就没用了,后面会有ssh来代替* 作用:* 用来检测hibernate中的配置文件的准确性* hibernate.cfg.xml* *.hbm.xml* * @author 2019072303**/public class SessionFactoryUtils {private static SessionFactory sessionFactory;static {Configuration cfg = new Configuration().configure("hibernate.cfg.xml");sessionFactory = cfg.buildSessionFactory();}public static Session openSession() {Session session = sessionFactory.getCurrentSession();if(session == null) {session = sessionFactory.openSession();}return session;}public static void closeSession() {//从本地的线程中获取session会话,第一次肯定是获取不到的,//那么需要重新让sessionfactory创建//第二次就能够对第一次创建的session反复利用,节约性能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());}
}
自定义主键生成器
MyTsGenerator
package com.liuxia.two.id;import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentityGenerator;public class MyTsGenerator extends IdentityGenerator {public Serializable generate(SharedSessionContractImplementor sessionContractImplementor) {SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ");return "book_order_"+sdf.format(new Date());}}
注意:
我们要把Worker.hbm.xml的配置文件修改成
<generator class="com.liuxia.two.id.MyTsGenerator" />
谢谢
Hibernate主键生成策略相关推荐
- 基于按annotation的hibernate主键生成策略
这里讨论代理主键,业务主键(比如说复合键等)这里不讨论. 一.JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id ...
- JPA实体注解与hibernate主键生成策略
JPA实体注解与hibernate主键生成策略 用hibernate注解开发项目,对于主键的生成策略有些模糊,下面是从新浪网里面看到的一篇关于hibernate注解以及主键生成策略的文章,值得一看: ...
- jpa基于按annotation的hibernate主键生成策略
JPA注解持久化类很方便,需要jar包:ejb3-persistence.jar下载 一.JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hi ...
- JavaEE持久层框架对比与hibernate主键生成策略总结
一.持久层框架对比 ORM框架:即对象关系映射.它把数据库表映射到pojo类,然后通过对类的操作来实现对数据库的增删改查,sql语句自动生成. 对于代码开发者来说,就是在代码里先创建数据库连接对象,然 ...
- Hibernate主键生成策略总结(这里面讲的很详细)
Hibernate提供的主键生成策略,使我们可以在实体类的映射xml文件中设定关键字来告诉hibernate我们要使用的主键生成方式,然后hibernate会根据设定完成数据库的主键控制. 一.首先通 ...
- 【Hibernate】hibernate主键生成策略与配置详解
//####################################################### **Hibernate各种主键生成策略与配置详解** //############# ...
- Hibernate主键生成策略与save()方法是否发sql语句的研究
public class SessionFlushTest extends TestCase { /** * 测试uuid主键生成策略 */ pu ...
- Hibernate主键生成策略总结
Hibernate提供的主键生成策略,使我们可以在实体类的映射xml文件中设定关键字来告诉hibernate我们要使用的主键生成方式,然后hibernate会根据设定完成数据库的主键控制. 一.首先通 ...
- 常用Hibernate 主键生成策略(徐瑞文)
ORM映射基本原理 1. 基于相同实体类和表,实现相互映射,类的对象对应了表中的记录,不同对象对应不同的记录,不同的记录对应不同的对象 2. 表中不同的记录通过主键来区分,不同的对象通过对象id来区分 ...
- hibernate主键生成策略 问题
转载自:https://www.jianshu.com/p/79311d81e77f 首先,如果出现这个问题你很有可能就是没有很好的注意到主键的生成策略.说到这里是不是就像去看看主键的生成呢? 在.h ...
最新文章
- Alluxio 1.5集群搭建
- 表分区MySQL版本:5.5.11比5.1查询速度明显提高(4倍左右)
- mysql5.7导入数据的权限问题
- 【测试点分析】1060 爱丁顿数 (25分)_21行代码
- leetCode 53. maximum subarray
- react textarea 空格为什么不换行_你需要的 React + TypeScript 50 条规范和经验
- 开源开放 | DeepKE发布新版本:支持低资源、长篇章、多任务的图谱抽取开源框架(浙江大学)...
- Python operator.lt()函数与示例
- html是纯文本语言吗,记事本是纯文本文件吗
- java spring 实现策略,Spring 环境下实现策略模式的示例
- GPS 实景识别网络搭建项目(源码免费领取)
- vagrant特性——基于docker开发环境(docker和vagrant的结合)-2-命令
- Linux设备驱动模型一 sysfs
- Tomcat—如何在Windows 7中修改Tomcat的端口号
- Flash Memory 简介
- 计算机制图作品答辩,教师资格证考试小学信息技术《认识画图》答辩
- alias实现VREP/Coppeliasim等软件在任意路径以自定义名称启动
- 孤立森林(隔离树)译文
- Verilog中任务task的使用
- 这部手机爆火了,网友:新一代自拍神器?