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>  

 

 











 

posted @ 2017-02-11 13:23  茅坤宝骏氹  阅读(164)  评论(0编辑  收藏  举报