• hibernate框架之主键生成


    一、hibernate框架中主键的生成策略


     (1)native表示由设置的方言决定采用什么数据库生成主键方式,根据底层数据库能力选择identity、sequence中的一个。

      例如:在MySQL中会采用自增长的方式,主键字段必须都是整形类型;在Oracle数据库中,会采用序列的增长方式。

     (2)sequence表示采用数据库的序列生成主键,适用于OracleDB2数据库中。

     (3)identity表示采用自增长的主键生成方式,适用于MySQL,SQL Server中。

     (4)foreign:使用另外一个相关联的对象的标示符。通常和<one-to-one>配合使用

                 ————以上是数据库生成主键(代理主键) 

     (5)increment表示由框架本身提供计数器,累加数据,获取主键。

     (6)uuid由框架根据参数(IP地址,JVM虚拟机启动时间,系统时间,计数器等)生成3216进制的数字字符串。

                 ————以上是Hibernate框架生成主键值(代理主键) 

     (7)Assigned用户(自己)提供主键。<generator>没有指定时的默认生成策略


     (8)Hilo: 使用高低位算法生成主键,高低位算法使用一个高位值和一个低位值,然后把算法得到的两个值拼接起来作为数据库中的唯一主键。Hilo方式需要额外的数据库表和字段提供高位值来源。默认情况下使用的表是hibernate_unique_key,默认字段叫作next_hi。next_hi必须有一条记录否则会出现错误。
              特点:需要额外的数据库表的支持,能保证同一个数据库中主键的唯一性,但不能保证多个数据库之间主键的唯一性。Hilo主键生成方式由Hibernate 维护,所以Hilo方式与底层数据库无关,但不应该手动修改hi/lo算法使用的表的值,否则会引起主键重复的异常。
     

                ————用户提供主键(自然主键) 


    二、javaBean 的hibernate的hbn.xml配置id主键生成

    com.hibernate.User类

    package com.hibernate;
    
    public class User {    
        private String id;    
        private String username;    
        private String password;    
            
        public String getId() {    
            return id;    
        }    
        public void setId(String id) {    
            this.id = id;    
        }    
        public String getUsername() {    
            return username;    
        }    
        public void setUsername(String userName) {    
            this.username = userName;    
        }    
      
        public String getPassword() {    
            return password;    
        }    
        public void setPassword(String password) {    
            this.password = password;    
        }    
    } 

    User.hbm.xml配置文件

    <?xml version="1.0"?>  
    <!DOCTYPE hibernate-mapping PUBLIC   
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
          
    <hibernate-mapping>  
        <!-- 类与数据库的表对应 -->  
        <class name="com.hibernate.User" table="user">  
       <!-- 主键名 -->  
            <id name="id" column="id">  
             <!-- 生成策略 -->  
                <generator class="uuid"/>  
            </id>  
         <!-- 其他类属性与表字段 -->   
            <property name="username" column="username"/>  
            <property name="password"/>  
        </class>  
    </hibernate-mapping>

    hibernate 配置文件

    <!DOCTYPE hibernate-configuration PUBLIC  
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
      
    <hibernate-configuration>  
        <session-factory >  
            <!-- mysql数据库驱动 -->  
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
            <!-- mysql数据库名称 -->  
            <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_db</property>  
            <!-- 数据库的登陆用户名 -->  
            <property name="hibernate.connection.username">root</property>  
            <!-- 数据库的登陆密码 -->  
            <property name="hibernate.connection.password">admin</property>  
            <!-- 方言:为每一种数据库提供适配器,方便转换 -->  
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>  
             <!--配置类与表的映射文件 -->  
            <mapping resource="com/hibernate/User.hbm.xml"/>
        </session-factory>  
    </hibernate-configuration>  


    三、javaBean的hibernate的Annotation注解配置id主键生成

    com.hibernate.User类

    //当前的类是一个持久化类,是User 这个类。他映射了一个表user。所对应的 数据库是hibernate_db
    //这句:@Table(name = "user", catalog = "hibernate_db") 可以省略
    @Entity
    @Table(name = "user", catalog = "hibernate_db")
    public class User {  
    
        // 主键 :@Id    主键生成方式:strategy = "increment"
        //映射表中id这个字段,不能为空,并且是唯一的
       @GenericGenerator(name = "generator", strategy = "increment")   
       @Id
       @GeneratedValue(generator = "generator")
       @Column(name = "id", unique = true, nullable = false)
        private String id;  
    
        //映射表中username这个字段 ,长度是500
       @Column(name = "username", length = 500)
        private String username;  
    
        //不写注解代表属性名与表名相同,不需要映射类的属性使用注解@Transient
        private String password;  
          
        public String getId() {  
            return id;  
        }  
        public void setId(String id) {  
            this.id = id;  
        }  
        public String getUsername() {  
            return username;  
        }  
        public void setUsername(String userName) {  
            this.username = userName;  
        }  
    
        public String getPassword() {  
            return password;  
        }  
        public void setPassword(String password) {  
            this.password = password;  
        }  
    }  

    hibernate 配置文件

    <!DOCTYPE hibernate-configuration PUBLIC  
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
      
    <hibernate-configuration>  
        <session-factory >  
            <!-- mysql数据库驱动 -->  
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
            <!-- mysql数据库名称 -->  
            <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_db</property>  
            <!-- 数据库的登陆用户名 -->  
            <property name="hibernate.connection.username">root</property>  
            <!-- 数据库的登陆密码 -->  
            <property name="hibernate.connection.password">admin</property>  
            <!-- 方言:为每一种数据库提供适配器,方便转换 -->  
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>  
             <!--配置类映射文件 -->  
            <mapping class="com.hibernate.User"/>
        </session-factory>  
    </hibernate-configuration>  











  • 相关阅读:
    java解决跨域
    时间格式化
    base64图片实现文件上传
    java对Base64图片的加密解密
    A5/web项目连接Oracle 12c数据库报:ORA-01017: 用户名/口令无效
    JavaScript中call如何使用?
    C# 如何让new 出来的form显示在最外层?
    因为数据库和客户端字符集不一样原因,导致显示乱码???????,解决办法
    日语键盘按键修正记录
    keybd_event 在F按键系列不起作用的解决办法
  • 原文地址:https://www.cnblogs.com/maokun/p/6710811.html
Copyright © 2020-2023  润新知