实体类映射文件(<mappingresource="cn/zc/domain/User.hbm.xml"/>):
User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mappingpackage="cn.zc.domain">
<classname="User" table="user">
<idname="id" column="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<propertyname="sex"/>
<propertyname="number"/>
<propertyname="birthday"/>
</class>
</hibernate-mapping>
常用配置信息:
<hibernate-mapping package="cn.zc.domain"> package指定实体所在路径
<class name="User"table="user"> name指定实体名字,table指定数据库中映射的表
<id name="id"column="id"> id元素:指定每个持久化类的唯一标识到数据库表主键字段的映射、name属性:指定持久化类的OID名、column属性:指定数据库表主键字段名(可省略)、type属性:指定主键映射时所使用的Hibernate类型名(可省略)
<propertyname="name"/> name属性:指定持久化类的属性名、column属性:指定数据库表主键字段名(可省略)、type属性:指定主键映射时所使用的Hibernate类型名(可省略)、not-null属性:指定此属性映射到数据库表的字段值是否允许为空值。
<generatorclass="native"/> generator元素:指定对象标识符的生成器名。
Hibernate主键生成策略的常用配置属性即generator class属性的取值
属性名称 | 说明 |
incrment | 用于为long、short或int类型生成唯一标识,在集那群下不要使用该属性 |
identity | 由底层数据库生成主键,前提是底层 数据库支持自增字段类型 |
sequence | 根据底层数据库的序列生成主键,前提是底层数据库支持序列 |
hilo | 根据高/低算法生成,把特定表的字段作为高位值来源,在默认的情况下选用hibernate_unique_key表的next_hi字段 |
native | 根据底层数据库对自动生成标识符的支持能力选择identity、sequence或hilo |
assigned | 由程序负责主键的生成,此时持久化类的唯一标识不能声明为private类型 |
select | 通过数据库触发器生成主键 |
foreign | 使用别一个相关联的对象的标识符,通常和<one-to-one>一起使用 |
<property>元素的常用配置属性、
属性名称 | 说明 |
incrment | 用于为long、short或int类型生成唯一标识,在集那群下不要使用该属性 |
identity | 由底层数据库生成主键,前提是底层 数据库支持自增字段类型 |
sequence | 根据底层数据库的序列生成主键,前提是底层数据库支持序列 |
hilo | 根据高/低算法生成,把特定表的字段作为高位值来源,在默认的情况下选用hibernate_unique_key表的next_hi字段 |
native | 根据底层数据库对自动生成标识符的支持能力选择identity、sequence或hilo |
assigned | 由程序负责主键的生成,此时持久化类的唯一标识不能声明为private类型 |
select | 通过数据库触发器生成主键 |
foreign | 使用别一个相关联的对象的标识符,通常和<one-to-one>一起使用 |
Hibernate应用的主要接口和类:
Configuration类
负责管理 Hibernate 的配置信息,加载hibernate.cfg.xml配置文件
SessionFactory接口
一个SessionFactory实例对应一个数据存储源。应用程序从SessionFactory中获取Session实例。
保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存)
Session接口
是 Hibernate 运作的中心,所有持久化对象必须在 session 的管理下才可以进行持久化操作。
常用方法:
save()//把Java对象保存数据库中
persist()//把Java对象保存数据库中与save方法的区别在没有开启事务的时候,persist插入的语句没有做,而save插入的操作确做了,可是回滚了,
没开启事务的时候persist方法不会生成sql语句,而save方法会生成sql语句并且执行了,只是事务没开启,又回滚了。
update()//更新数据库中的Java对象
delete()//把Java对象从数据库中删除
get()//查询实体对象,不存在时候返回null
load()//从数据库中加载Java对象
merge()//将给定的对象的状态复制到具有相同标识的持久化对象上。
find()//从数据库中查询Java对象
saveOrUpdate()//接收一个实体对象,根据实体对象的id判断是否已经存在进行保存或更新操作,这样保存和更新方法就统一了;
Transaction接口
代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行。
常用方法:
commit()//提交相关联的session实例
rollback()//撤销事务操作
wasCommitted()//检查事务是否提交
Query和Criteria接口
都是查询接口,Query实例包装了HQL查询语句,hql是面向对象的,它引用类名及类的属性名,而不是表名和字段名。
Criteria接口完全封装了基于字符串形式的查询语句,比Query接口更面向对象,它擅长执行动态查询。
Hibernate中对象的三种状态:
<1>瞬时态 (Transient)
<2>持久态(Persistent)
<3>脱管态(Detached)
1、 瞬时态:
由new命令开辟内存空间的java对象. 如果没有变量对该对象进行引用,它将被java虚拟机回收。
瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,
可通过session的save()或 saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,
此时该瞬时对象转变成持久化对象。
2、 持久态:
处于该状态的对象在数据库中具有对应的记录。当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,
此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下。
持久对象具有如下特点:
(1)和session实例关联;
(2)在数据库中有与之关联的记录。
3、脱管态:
当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。
脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转
变成持久对象。
脱管对象具有如下特点:
(1) 本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;
(2) 比瞬时对象多了一个数据库记录标识值