zoukankan      html  css  js  c++  java
  • Hibernate主键生成策略

     
    一、 主键生成策略
    策略名 说明
    increment                    increment策略是指,不使用数据库本地的自增长策略,而是由程序(Hibernate框架)产生一个自增长的ID值,赋予数据库.
    idenitty identity策略,指定必须使用数据库里面的ID自增长策略. 只能用于支持ID自增长功能的数据库,如:MySQL,SQLServer.. 不支持没有ID自增长策略的数据库,如Oracle,DB2..
    sequence  使用序列的实现ID生成策略,主要用于有序列的数据库.如:Oracle,DB2,如果不支持序列的数据库(如:MYSQL),该策略会使用一个表模拟序列。
    native

    使用数据库本地的策略,就是数据库里面使用怎么样的策略就用什么策略,HIbernate不做任何的判断.如:MySQL数据库使用了increment_auto,自增长策略.使用native.表示直接调用数据库里面的increment_auto策略.

    uuid     就是数据库的主键是使用一个唯一的字符串的来存储.这个唯一的字符串就是UUID
    assigned assigned策略,就是不使用主键生成策略,由手工输入ID.
    1.1 increment生成策略
     
    increment策略是指,不使用数据库本地的自增长策略,而是由Hibernate框架产生一个自增长的ID值,赋予数据库的主键。
    好处:兼容好,可以支持各种数据库。
    缺点:由于框主键值由架生成,所以效率相对低。
    1.2   注意事项:应用场景:适合一些需要支持多种数据库的产品型项目。
    --生成的数据库表结构,是没有使用数据库自带的主键自增长的
     
     
     
    --控制台输出
    --根据分析,得出:数据库会每一次使用max获得主键列的最大值加1
     
     
     
     
    2  identity 生成策略(重要)
    identity策略,指定使用数据库里面的ID自增长策略. 只能用于有ID自增长功能的数据库,如:MySQL,SQLServer.. 不支持没有ID自增长策略的数据库,如Oracle,DB2..
    好处:默认就认为数据库是使用ID自增长策略,效率高
    缺陷:兼容差。不支持使用序列实现ID自增长的数据库
     
    3 .  native 生成策略
    使用数据库本地的策略,就是数据库里面使用怎么样的策略就用什么策略,HIbernate不做任何的判断.如:MySQL数据库使用了increment_auto,自增长策略.如果Oracle使用native就使用序列生成主键值。
     
    4.1 .  sequence  生成策略
    一般用于支持序列的数据库,如ORACLE。
    4.2    配置信息
     
      <!-- 主键生成策略
                  数据库的主键值可以很多种生成方式,HIbernate通过主键生成策略来指定其中一种
                  sequence策略,主要用于有序列的数据库
                -->
                <!-- 通过org.hibernate.id.enhanced.SequenceStyleGenerator 找参数-->
                <generator class="sequence">
                   <!--
                   sequence_name:用于设置序列名
                   initial_value:序列开始位置
                   increment_size:步长
                    -->
                   <param name="sequence_name">seq_student</param>
                </generator>
            </id>
     
    5   UUID生成策略
     
    5.1 说明
     
    UUID主要用于存储基础数据的表。所谓的基础数据,就是系统必须依赖的数据。
    就是数据库的主键是使用一个唯一的字符串的来存储.这个唯一的字符串就是UUID。
     
    应用场景:
    有几个开发人员同时开发一个项目。前提每个开发人员使用的都是自己电脑的数据库。
     如果使用ID自增长作为ID列的值,就会导致每个人的数据的ID值冲突。
     但是如果大家使用UUID。那么冲突的概率,极小。
    5.2  配置信息
     
    在xxx.hbm.xml id中配置
         <id name="stuId" column="stu_id">
           <!--
            uuid策略:就是数据库的主键是使用一个唯一的字符串的来存储
            -->
           <generator class="uuid"></generator>
         </id>
    注意事项:--实体类,主键列必须是字符串类型
     
        
    --生成的表结构
    --可以看到,存储的记录的主键列的值为一个UUID ,一个唯一的字符串
     
     
     
     
     
    6  assinged主键生成策略
     
      assigned策略:就是不使用主键自动生成值的策略,需要手工写入ID的值
    public void save(){
           //1.获得操作对象
           Session session = HibernateUtils.getSession();
           //2.打开事务,操作都需要打开事务(增删改)
           Transaction transaction = session.beginTransaction();
           //3.操作
           Student s=new Student();
           s.setStuName("李四");
            //assigned策略,必须需要手工写入ID的值。
           s.setStuId(1L);
           session.save(s);
           //4.提交事务
           transaction.commit();
           //5.关闭操作类对象session
           session.close();
        }
     
    }
     
  • 相关阅读:
    SQL: 从一个表随机读取一行或几行记录的问题
    Android: 创建一个AlertDialog对话框,必须按确定或取消按钮才能关闭对话框,禁止按[返回键]或[搜索键]关闭
    Asp: 解决脚本输出网页出现乱码情况
    Java: |(或运算) 与 多选判断
    ASP: Response 对象 错误 'ASP 0251 : 80004005' 解决办法
    Java: 在dos窗口输入密码,不要把密码直接显示出来,原来可以这么简单
    Android: 网络随时需要在3G和Wifi切换,网络程序需要注意
    Android: 待机时如何让程序继续运行 extends Service
    Android: View换切后,无法正常设置焦点或切换后TextView的虚拟键盘不弹出
    MySQL存储过程学习笔记
  • 原文地址:https://www.cnblogs.com/aknife/p/11344601.html
Copyright © 2011-2022 走看看