一、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>