一、hibernate框架中主键的生成策略
(1)native: 表示由设置的方言决定采用什么数据库生成主键方式,根据底层数据库能力选择identity、sequence中的一个。
例如:在MySQL中会采用自增长的方式,主键字段必须都是整形类型;在Oracle数据库中,会采用序列的增长方式。
(2)sequence: 表示采用数据库的序列生成主键,适用于Oracle,DB2数据库中。
(3)identity: 表示采用自增长的主键生成方式,适用于MySQL,SQL Server中。
(4)foreign:使用另外一个相关联的对象的标示符。通常和<one-to-one>配合使用
————以上是数据库生成主键(代理主键)
(5)increment: 表示由框架本身提供计数器,累加数据,获取主键。
(6)uuid: 由框架根据参数(IP地址,JVM虚拟机启动时间,系统时间,计数器等)生成32位16进制的数字字符串。
————以上是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>