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语句,数据库中就会有数据。

    没有人能一路单纯到底,但是要记住,别忘了最初的自己!
  • 相关阅读:
    error: <item> inner element must either be a resource reference or empty.
    PEM routines:PEM_read_bio:no start line
    Android Https双向认证 + GRPC
    git tag用法
    Linux文件查找
    Detected problems with API compatibility(visit g.co/dev/appcompat for more info)
    Android NDK开发调试
    Beyond-Compare 4 -linux 破解
    Ubuntu下Gradle环境配置
    多线程系列一
  • 原文地址:https://www.cnblogs.com/LindaBlog/p/5457345.html
Copyright © 2011-2022 走看看