Hibernate

学习的核心

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!关于学习Hibernate,我可以为你提供一些指导。Hibernate是一个Java持久化框架,用于将Java对象映射到关系数据库中。它简化了与数据库的交互,提供了ORM(对象关系映射)的功能。 如果你想学习Hibernate,以下是一些建议的步骤: 1. 了解基本概念:开始之前,建议你先了解一些Hibernate的基本概念,例如持久化、实体类、会话(Session)等。这将帮助你更好地理解Hibernate的工作原理。 2. 学习Hibernate配置:Hibernate使用一个配置文件来连接数据库和定义映射关系。你可以学习如何配置Hibernate以适应你的项目需求。这包括数据库连接配置、实体类映射等。 3. 学习Hibernate实体映射:Hibernate通过注解或XML文件将Java实体类映射到关系数据库表中。你可以学习如何使用注解或XML文件来定义实体类的映射。 4. 学习Hibernate查询语言(HQL):HQL是一种类似于SQL的查询语言,用于对数据库进行查询操作。学习如何使用HQL进行查询和操作数据库是很重要的。 5. 学习Hibernate事务管理:事务管理是在处理数据库操作时非常重要的一部分。学习如何使用Hibernate进行事务管理,包括开启事务、提交事务、回滚事务等。 6. 实践项目:最好的学习方法是通过实际项目来应用所学的知识。尝试在一个小型项目中使用Hibernate来进行数据库操作,这将帮助你更好地理解和掌握Hibernate的使用。 除了上述步骤,还有很多其他方面的内容可以学习,例如缓存管理、性能优化等。希望这些步骤能够帮助你入门Hibernate!如果你有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值