zoukankan      html  css  js  c++  java
  • *****hibernate主键生成

    一、主键
    主键是关系数据库中的一个基本概念,它用来保证记录的唯一性主键都是没有业务含义的,所以开发
    者不会、也不需要,显示地设置实体对象的主键值。但是对于数据库来说,主键是必须的
    Hibernate内置了两类策略:
    一类是JPA标准的主键生成策略,一类是Hibernate框架特有的主键生成策略。
    JPA标准策略有4种:

    1.auto策略(JPA默认的策略)如:
    public class Teacher
    {
    private int id;
    private String title;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public int getId()
    {
    return id;
    }
    }
    我使用的
    2.table策略(保存插入记录的时,需要的主键值)如:
    public class Teacher
    {
    private int id;
    private String title;

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE,generator="myTableGenerator")
    @TableGenerator(name = "myTableGenerator", table = "hibernateNeedTable",
    pkColumnName = "pk_key", valueColumnName = "pk_value", pkColumnValue =
    "teacherId",
    initialValue = 100, allocationSize = 1000)
    public int getId()
    {
    return id;
    }
    }
    3.sequence策略(为了使用序列)如:
    public class Teacher
    {
    private int id;
    private String title;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="mySeqGenerator")
    @SequenceGenerator(name = "mySeqGenerator", sequenceName = "t_teacher_sequence",
    initialValue = 1000, allocationSize = 50)
    public int getId()
    {
    return id;
    }
    }
    这里需要配合使用@SequenceGenerator,用来指定序列的相关信息。
    name:序列生成器的名称,会在@GeneratedValue中进行引用

    sequenceName:oracle数据库中的序列生成器名称

    initialValue:主键的初始值

    allocationSize:主键每次增长值的大小
    注意:如果底层数据库不执行序列,会报错:

    org.hibernate.MappingException: org.hibernate.dialect.MySQLDialect does not support
    sequences

    4.identity策略(提供了对自增主键的支持)如:
    public class Teacher
    {
    private int id;
    private String title;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public int getId()
    {
    return id;
    }
    }

    二、总结

    hibernate中一个数据模型的主键常用有三种形式:uuid、native、assigned,分别是通用唯一标识、自
    增、自定义。
    1、uuid是系统产生的,insert数据库时相比native要快很多,但是uuid是一长串无序字符串,理论上讲
    查找起来会慢一点,但是不太会影响开发的。uuid即通用唯一标识,在不知道怎么定义主键时,它是不二的选择;
    1.1、生成简单,java中已经有现成的东西,引入java.util.UUID,
    1.2、通用唯一,其实可以加上全球,uuid的生成原理:
    当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,
    则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没
    有网卡以其他方式获得);
    1.3、在任何时候两个相同数据表的数据放在一起不会出现主键冲突,这在实际开发中会带来很大的好处。
    2、而native是数据库生成,在insert时会先计算所以会比uuid慢一点,但是在查找和删除数据时,会比较方便。
    3、uuid和assigned的生成是在程序中完成的,一个是自动,一个是手动。所以在进行session.save()
    时,不会产生sql语句,数据库中也不会有数据。而native需要读取数据库数据才能完成自动递增,所以
    在执行session.save()时,就会产生相应的sql语句,数据库中就会有数据。

    没有人能一路单纯到底,但是要记住,别忘了最初的自己!
  • 相关阅读:
    Android 开发 深入理解Handler、Looper、Messagequeue 转载
    Android 开发 Handler的基本使用
    Java 学习 注解
    Android 开发 AlarmManager 定时器
    Android 开发 框架系列 百度语音合成
    Android 开发 框架系列 Google的ORM框架 Room
    Android 开发 VectorDrawable 矢量图 (三)矢量图动画
    Android 开发 VectorDrawable 矢量图 (二)了解矢量图属性与绘制
    Android 开发 VectorDrawable 矢量图 (一)了解Android矢量图与获取矢量图
    Android 开发 知晓各种id信息 获取线程ID、activityID、内核ID
  • 原文地址:https://www.cnblogs.com/LindaBlog/p/5457345.html
Copyright © 2011-2022 走看看