我们都知道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