hibernate的主键生成器策略

我们都知道Hibernate提供相应的API能自动生成数据库表,说到表,一定会设计到的一个概念就是主键,主键是由程序自动生成的,不应该由用户自己输入,那么Hibernate在往表中填充数据库时,主键是怎么生成的那,Hibernat提供了主键生成策略

 第一种:assigned主键策略程序员自己手动添加,因为它不能自动生成(数据类型不限、保存前必须赋值)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
     <!-- name:类的权限类名     table:对应的数据库表名  -->
    <class name="com.damei.two.entity.Student" table="t_hibernate_student">
      <!-- name:类属性    type:数据类型    column:数据库对应的列段 -->
    <id name="sid" type="java.lang.Integer" column="sid">
    
     <!-- 数据库表的主键 生成策略   assigned:代表id由程序员自己手动添加-->
      <generator class="assigned"></generator> 
   
    </id>
    <!-- name:类属性    type:数据类型    column:数据库对应的列段 -->
    <property name="sname" type="java.lang.String" column="sname"></property>
    </class>
    </hibernate-mapping>


第二种 : identity(标识列/自动增长) 主键 生成策略  identity(标识列/自动增长) 由数据库控制 且id在数据库是自增长 
这样 id就不用再赋值  但是id必须是数字类型的-

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
     <!-- name:类的权限类名     table:对应的数据库表名  -->
    <class name="com.damei.two.entity.Student" table="t_hibernate_student">
      <!-- name:类属性    type:数据类型    column:数据库对应的列段 -->
    <id name="sid" type="java.lang.Integer" column="sid">
    
     <!-- 数据库表的主键 生成策略  identity(标识列/自动增长) 由数据库控制-->
      <generator class="identity"></generator>
     
    </id>
    <!-- name:类属性    type:数据类型    column:数据库对应的列段 -->
    <property name="sname" type="java.lang.String" column="sname"></property>
    </class>
    </hibernate-mapping>


第三种 :uuid.hex会自动生成16进制uuid主键,由hibernate控制 ,如果将id设置为这种策略,那么实体类id属性必须要定义成字符串string类型

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
     <!-- name:类的权限类名     table:对应的数据库表名  -->
    <class name="com.damei.two.entity.Student" table="t_hibernate_student">
      <!-- name:类属性    type:数据类型    column:数据库对应的列段 -->
    <id name="sid" type="java.lang.Integer" column="sid">
     
    <!-- 数据库表的主键 生成策略 uuid hibernate控制   但是id必须是String类型的-->
     <generator class="uuid"></generator> 
    </id>
    <!-- name:类属性    type:数据类型    column:数据库对应的列段 -->
    <property name="sname" type="java.lang.String" column="sname"></property>
    </class>
    </hibernate-mapping>


 

第四种: increment 由hibernate控制 ,当添加数据到mysql数据库时不需要设置id的值  但是id必须是数字型的

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
     <!-- name:类的权限类名     table:对应的数据库表名  -->
    <class name="com.damei.two.entity.Student" table="t_hibernate_student">
      <!-- name:类属性    type:数据类型    column:数据库对应的列段 -->
    <id name="sid" type="java.lang.Integer" column="sid">
   
    <!-- 数据库表的主键 生成策略  increment hibernate控制  id就不用再赋值  但是id必须是数字类型的-->
      <generator class="increment"></generator>
    </id>
    <!-- name:类属性    type:数据类型    column:数据库对应的列段 -->
    <property name="sname" type="java.lang.String" column="sname"></property>
    </class>
    </hibernate-mapping>

sequence
只适用于支持sequence机制生成主键的数据库,主键值由数据库生成,如MySql就不支持,Oracle就支持

native
      native由hibernate根据使用的数据库自行判断采用identity、sequence其中一种作为主键生成方式,灵活性很强,这样以来如果一个项目中使用多个数据库时,就可以使用这种方式
 

 最后在说一下它们对数据库的依赖性:

1):UUID,assigned:对数据库无依赖
2):identity:依赖Mysql或sql server,主键值不由hibernate维护
3):sequence:适合于oracle等支持序列的dbms,主键值不由hibernate维护,由序列产生
4):native:根据底层数据库的具体特性选择适合的主键生成策略,如果是mysql或sqlserver,选择identity,如果是oracle,选择sequence
 

猜你喜欢

转载自blog.csdn.net/lxxiaocaiji/article/details/84555967