目录:

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&amp;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主键生成策略相关推荐

  1. 基于按annotation的hibernate主键生成策略

    这里讨论代理主键,业务主键(比如说复合键等)这里不讨论. 一.JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id ...

  2. JPA实体注解与hibernate主键生成策略

    JPA实体注解与hibernate主键生成策略 用hibernate注解开发项目,对于主键的生成策略有些模糊,下面是从新浪网里面看到的一篇关于hibernate注解以及主键生成策略的文章,值得一看: ...

  3. jpa基于按annotation的hibernate主键生成策略

    JPA注解持久化类很方便,需要jar包:ejb3-persistence.jar下载 一.JPA通用策略生成器  通过annotation来映射hibernate实体的,基于annotation的hi ...

  4. JavaEE持久层框架对比与hibernate主键生成策略总结

    一.持久层框架对比 ORM框架:即对象关系映射.它把数据库表映射到pojo类,然后通过对类的操作来实现对数据库的增删改查,sql语句自动生成. 对于代码开发者来说,就是在代码里先创建数据库连接对象,然 ...

  5. Hibernate主键生成策略总结(这里面讲的很详细)

    Hibernate提供的主键生成策略,使我们可以在实体类的映射xml文件中设定关键字来告诉hibernate我们要使用的主键生成方式,然后hibernate会根据设定完成数据库的主键控制. 一.首先通 ...

  6. 【Hibernate】hibernate主键生成策略与配置详解

    //####################################################### **Hibernate各种主键生成策略与配置详解** //############# ...

  7. Hibernate主键生成策略与save()方法是否发sql语句的研究

    public class SessionFlushTest extends TestCase {              /**     * 测试uuid主键生成策略     */       pu ...

  8. Hibernate主键生成策略总结

    Hibernate提供的主键生成策略,使我们可以在实体类的映射xml文件中设定关键字来告诉hibernate我们要使用的主键生成方式,然后hibernate会根据设定完成数据库的主键控制. 一.首先通 ...

  9. 常用Hibernate 主键生成策略(徐瑞文)

    ORM映射基本原理 1. 基于相同实体类和表,实现相互映射,类的对象对应了表中的记录,不同对象对应不同的记录,不同的记录对应不同的对象 2. 表中不同的记录通过主键来区分,不同的对象通过对象id来区分 ...

  10. hibernate主键生成策略 问题

    转载自:https://www.jianshu.com/p/79311d81e77f 首先,如果出现这个问题你很有可能就是没有很好的注意到主键的生成策略.说到这里是不是就像去看看主键的生成呢? 在.h ...

最新文章

  1. mysql 安装dso命令_LAMP环境搭建
  2. 1082 Read Number in Chinese (25 分)【难 / 模拟 字符串】
  3. vc设置按钮文字颜色
  4. VTK:PolyData之PointSampler
  5. anaconda matplotlib 输出动画_Python+Matplotlib 制作排序算法的动画
  6. 剑指offer 26.数字的子结构
  7. MobaXterm远程连接Linux图形用户界面
  8. CAP、BASE、ACID基本概念
  9. mysql配置命令大全_MySQL常用命令汇总
  10. 怎样在电脑桌面上显示计算机,怎样在电脑桌面上显示天气 - 卡饭网
  11. 加州大学戴维斯分校 计算机科学,UCDavis的Computer Science「加州大学戴维斯分校计算机科学专业」...
  12. BRD、MRD、PRD
  13. JAVA毕业设计装修设计管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库
  14. Mac OS 系统用不了Origin怎么办?
  15. 自动驾驶地图中的深度学习
  16. 震撼!世界从10亿光年到0.1飞米.
  17. 【优化算法】细菌粒子群优化算法【含Matlab源码 1195期】
  18. python info函数的作用是_Python函数__new__及__init__作用及区别解析
  19. 自助咖啡机解决方案 ,咖啡市场的新型售卖渠道
  20. ajax动态获取后台数据绘制echarts图表

热门文章

  1. 演绎、归纳与前言结构——Leo鉴书83
  2. 对抗攻击与防御 (2):对抗样本的反制策略
  3. 网易网盘关停!云端2T的“资源包、小电影”谁来守护?
  4. 夜神模拟器 Fiddler Tunnel to......443
  5. 正弦波叠加成方波--Python简易版
  6. 租房申请html模板,实用的租房房源标题模板
  7. 杂谈:人工智能发展的哲学研究
  8. 竹子的故事:送给那些坚持了很久却准备放弃的人 --- 厚积方能薄发
  9. 计算机改桌面存储地址,c盘桌面路径改为d盘(怎样更改电脑桌面存储路径)
  10. 英雄无敌Ⅲ之游戏修改器DIY