Hibernate

来源:互联网 发布:2ne1 解散 知乎 编辑:程序博客网 时间:2024/04/30 02:53

学习的核心

1.hibernage api

2.hibernate.cfg.xml

3.对象关系映射文件


3种开发方式:

1由Domain object 》mapping》db(官方推荐)

2由db开始,用工具生成mapping和domain object(使用比较多)

3由映射文件开始。

OID:object identifier  对象标识符


Transaction事务

commit():提交相关联的session实例

rollback():撤销实务操作

wasCommitted():检查事务是否提交


bhm2ddl配置属性:create每次都删除上一次的表,重新创建表;update:常用属性,更新数据表结构,不删现有结构

ceate-drop:sessionFactory关闭,表自动删除  validate:会和数据库中的表进行比较,若hbm.xml文件中的列数据表中不存在,则抛出异常


Session:hibernate操纵数据库最主要的方法,提供了基本的保存,更新,删除和加载Java对象的方法

session中有一个缓存,位于缓存中的对象成为持久化对象,它和数据库中的相关记录对应,在持久化的角度,hibernate把对象分为4种状态


临时对象:,在使用代理主键的情况下,oid通常为null;不处在session缓存中,数据库里面没有对应记录。

(举例:一个没有上班的人)

持久化对象(托管):oid不为null;位于session缓存中;在数据库中已经有和其对应的记录;同一个sesssion实例的缓存中,数据库表中的每条记录只对应唯一的持久化对象

(举例:在公司正式上班的人,有在职记录)

删除对象:数据库中没有 和其oid对应的记录;不处于session中;一般情况下,程序不该使用被删除的对象

(举例:从公司离职的人)

游离对象(脫管):OID不为null;不处于session缓存中;游离对象由持久对象转变过来的,因此在数据库中还存在与它对应的记录

(举例:从公司请假的人)


flush缓存:Session按照缓存中对象的属性变化来同步更新数据库

刷新缓存的时间点:1》显示的调用Session的flush()方法;2》Transaction的commi()方法;

3》程序要执行HQL查询时,如果缓存中持久化对象的属性已经发生了变化,会先flush缓存,以保证查询结果能够反映持久化对象的最新状态;

4》对象使用native生成器生成OID,当session调用save()方法时,会立即执行insert语句

commit和flush的区别:flush执行sql不提交事务;commit方法先调用flush方法然后再提交事务

session的setFlushMode()可以设定flush的时间点:AUTO(默认都清理)、Commit(查询操作不清理)、Never(手动调用flush才生效)


refresh:强制发送select语句,使得session缓存对象的状态和数据表中的对应记录保持一致。该方法的有效性需要配置事务的隔离级别为read commited(读已提交),在hibernate.cfg.xml文件中配置<propertyname="connection.isolation">2</property>

clear():清理缓存。



对象状态会转换的方法:get load save persist close update ...

save:是一个临时对象变为持久化对象;分配id;flush缓存时会发送一条insert语句;在save方法之前的id是无效的;持久化的ID是不能被修改的

persist::完成一个insert操作,和save的区别,有id会抛异常。把一个瞬态的实例持久化,但是并"不保证"标识符(identifier主键对应的属性)被立刻填入到持久化实例中,标识符的填入可能被推迟到flush的时候。


get 和load

都会执行select操作,get立即加载对象,load不使用对象的话,不会马上执行查询操作,得到是的代理对象

没有该对象记录,session未关,get返回null,load抛出异常

load可能会抛出“懒加载异常”LazyInitializationExcepiton:比如在初始化对象时,关闭了session

update

1》更新一个持久化对象,不需要手动调用update方法因为transaction的commit方法,会先执行session的flush方法

 2》更新一个游离对象,需要手动调用session的update方法。变为持久化对象

注意:无论要更新的游离对象和数据表达记录是否一致都会发送update语句。如何控制其不盲目的发出update语句?在hbm.xml的文件class节点设置,setlect-before-update=true(默认false),通常不设该属性,在使用到触发器时才如此。

若数据表中没有对应的记录,但还调用update方法,抛异常

当update方法关联一个游离对象,如果session的缓存中已经存在相同的oid持久化对象,会抛异常

saveOrUpdate()方法:临时对象就save,游离对象就update,判断标准如下

1》java对象的OID为null,若不为null,且数据表中还没有和其对应的记录,抛异常;

2》了解:映射文件中为<id>设置了unsaved-value属性,并且java对象OID取值与这个unsaved-value属性值匹配,就认为这个对象是没有被保存的。

delete()方法:执行删除操作,只要OID和数据表中一条记录对应,就准备执行delete操作;若OID在数据表中没有记录,则抛异常;可以通过设置hibernate的配置文件属性hibernate.user_identifier_rollback为true,使删除对象后,把其OID置为null

evict:从session缓存中把指定的持久化对象移除。

调用存储过程:需使用jdbc的方式调用 new Work()得到jdbc对象

hibernate与触发器协同工作:设置select-before-update ,或者手动调用refresh()方法


Hibernate配置文件:配置数据库连接和运行时所需的各种属性

肯定要配置数据连接池:举例

1. 在 hibernate 中使用 C3P0 数据源:
1). 导入 jar 包:
hibernate-release-4.2.4.Final\lib\optional\c3p0\*.jar
2). 加入配置:
hibernate.c3p0.max_size: 数据库连接池的最大连接数
hibernate.c3p0.min_size: 数据库连接池的最小连接数
hibernate.c3p0.acquire_increment: 当数据库连接池中的连接耗尽时, 同一时刻获取多少个数据库连接
hibernate.c3p0.timeout:   数据库连接池中连接对象在多长时间没有使用过后,就应该被销毁
hibernate.c3p0.idle_test_period:  表示连接池检测线程多长时间检测一次池内的所有链接对象是否超时.
连接池本身不会把自己从连接池中移除,而是专门有一个线程按照一定的时间间隔来做这件事,
这个线程通过比较连接对象最后一次被使用时间和当前时间的时间差来和 timeout 做对比,进而决定是否销毁这个连接对象。
hibernate.c3p0.max_statements:  缓存 Statement 对象的数量


cif.xml常用属性:

show_sql;format_sql;bhm2dll.auto;

hibernate.jdbc.fetch_size:设定jdbc的statement读取数据的时候每次从数据库中取出的条数,通常100;

hibernate.jdbc.batch_size:设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小,通常30;

mysql不支持上面的属性,oracle有效;


对象关系文件 *,hbm.xml




0 0