zoukankan      html  css  js  c++  java
  • 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>  











  • 相关阅读:
    线性代数思维导图——3.向量
    微分中值定理的基础题型总结
    构造函数
    Python课程笔记(七)
    0241. Different Ways to Add Parentheses (M)
    0014. Longest Common Prefix (E)
    0013. Roman to Integer (E)
    0011. Container With Most Water (M)
    0010. Regular Expression Matching (H)
    0012. Integer to Roman (M)
  • 原文地址:https://www.cnblogs.com/maokun/p/6710811.html
Copyright © 2011-2022 走看看