hbm映射文件配置和主键生成策略
1.hbm文件配置
①配置类到指定数据库中表的映射
<?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>
<!-- 1、类与表的映射 -->
<!--
name 类名
table 表名
catalog 数据库名
-->
<class name="cn.itcast.domain.Customer" table="customer" catalog="hibernate3day1">
<!-- 2、类中属性 与 表中 数据列 映射 -->
<!-- 主键 -->
<!--
name 属性名(类中)
column 列名 (表中)
type 类型
-->
<id name="id" column="id" type="int">
<!-- 主键策略 identity 主键自增长 -->
<generator class="native"></generator>
</id>
<!-- 普通属性 -->
<property name="name" column="name" type="java.lang.String" not-null="true"></property> <!-- java类型 -->
<property name="age" column="age" type="int"></property>
<property name="city">
<column name="city" sql-type="varchar(20)"></column> <!-- SQL类型 -->
</property>
</class>
<!-- 在配置文件中 定义SQL,给SQL命名,在程序通过login 使用SQL -->
<sql-query name="login">
<![CDATA[select * from user where username= ? and password =?]]>
</sql-query>
</hibernate-mapping>
* 在配置过程中,省略column 和 type ,如果不写column 生成列名就是属性名, 不写type将按照 类中属性类型自动映射
* 配置列其它属性 unique="true" 唯一 not-null="true" 非空 length="20" 长度
2.主键的生成策略
在<id>元素中 通过 <generator class="生成策略"></generator> 指定数据表主键生成策略
常用六种主键生成策略
①
increment
increment 标识符生成器由 Hibernate 以递增的方式为代理主键赋值
原理:select max(id) , insert max(id)+1
* 使用 increment 创建数据表 没有主键自增长, 通过hibernate在程序内部完成自增
* 好处跨平台 ,缺点 高并发访问时,可以出现主键冲突问题
②identity (无线程问题)---- Mysql
identity 标识符生成器由底层数据库来负责生成标识符, 它要求底层数据库把主键定义为自动增长字段类型
原理: 依赖数据库内部自增长,和hibernate无关
* 创建数据表 `id` int(11) NOT NULL AUTO_INCREMENT
* 优点,无需程序处理,数据库自己完成主键增长,缺点 Mysql支持 自增主键, oracle 不支持
③sequence --- Oracle
sequence 标识符生成器利用底层数据库提供的序列来生成标识符
原理: 依赖数据库序列支持 ,和hibernate程序无关
* Oracle 支持序列, Mysql 不支持序列
* 序列原理
create sequence customer_seq;
insert into customer(id) values(customer_seq.nextval); 自动序列+1
④native
native 标识符生成器依据底层数据库对自动生成标识符的支持能力, 来选择使用 identity, sequence 或 hilo 标识符生成器.
* Mysql 自动选择 identity , oracle 自动选择 sequence
⑤uuid
uuid 的主键生成,采用String 类型主键
随机生成32位字符串
⑥assigned
前五种策略,都是代理主键生成策略
assigned 是自然主键生成策略 ---- 必须用户在程序中指定 (无法自动生成)
* 复合主键 (联合主键),一个数据表中多列共同作为主键 -----复合主键是一种特殊 assigned 策略
<composite-id>
<!-- 配置多列 -->
<key-property name="firstname"></key-property>
<key-property name="secondname"></key-property>
</composite-id>
错误:
Caused by: org.hibernate.MappingException: composite-id class must implement Serializable: cn.itcast.domain.Person
复合主键类必须实现序列化接口