标签:行记录 nal factor 并且 语句 hiberna 删除对象 快照 image
Java Persistence API,是Java EE为ORM框架定义的规范,任何使用java语言的ORM框架都必须实现该规范。Hibernate/Mybatis都是是JPA的一种实现。
Object Relational Mapping,对象到关系的映射,在关系型数据库与对象之间建立映射关系,以实体对象操作关系型数据库。
将对数据库的操作永久地反映到数据库中的过程叫做持久化。
封装了对数据库进行持久化操作的框架叫做持久化框架。所谓框架就是在内部实现了一些常用的基本操作,提供简单的接口,缩减操作步骤,而且扩展了功能。
数据库连接是一个极其有限的宝贵资源,在Web应用程序中表现得尤为突出。Web应用访问量大,而数据库支持的并发连接数目是有限的,连接越多,速度越慢,降低了用户体验。
在数据库连接池产生以前,访问数据库需要先建立连接,访问结束后关闭连接,下次需要时再重复创建与关闭过程,而数据库连接的创建与关闭本身消耗大量的系统资源,这时产生了共享数据库连接的思想,数据库连接池应运而生。
Hibernate框架推荐使用C3P0:
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
负责加载配置文件,启动Hibernate。配置文件的默认名称为“hibernate.cfg.xml”,放在类路径下。
负责创建Session对象,保存了当前数据库中所有的映射关系,线程安全。重量级对象,初始化过程耗费大量的资源,因此在应用程序中应避免创建多个SessionFactory对象。
代表应用程序与数据库的一次会话,是Hibernate中持久化操作的核心,直接负责所有的持久化操作。
session对象线程不安全,应避免多个线程共享一个Session对象。多个线程共享一个session对象,可能会因为session缓存的存在出现数据泄露,或者一个线程关闭了session对象,另一个线程出现异常。
Session只能在事务内部运行,即未开启事务,无法运行Session。
Session session=sessionFactory.openSession();
Session session=sessionFactory.getCurrentSession();
<property name="current_session_context_class">thread</property>
Session一旦关闭,就标志着应用程序与数据库的一次会话结束,再次通信需要建立新的会话。
生成策略 | 含义 | 维护方 |
increment | 获取数据库中当前主键的最大值,加1作为新数据的主键 | Hibernate |
identity | 按照自增方式生成主键 | 数据库 |
native | 从底层数据库支持的主键生成策略中选择 | 数据库 |
assigned | 由程序员手动生成主键 | 程序员 |
sequence | 基于sequence表生成主键 | 数据库 |
uuid | 生成一个全球唯一的32位主键 | 数据库 |
对象被创建、未被Session调用时的状态,与数据库中的数据无连接,一旦被Session通过save或者saveOrUpdate调用方法转化为持久化状态。
被Session调用后、与数据库中的数据存在关联的状态。
当Session对象关闭以后,持久化对象由持久状态转化为脱管状态,持久化对象处在脱管状态下仍然与数据库中的数据存在关联,通过update或者saveOrUpdate转化为持久化状态
假如把关系型数据库中的表看做一个持久化类,每一行记录都是一个该类的对象,即持久化对象,一个对象如果在集合之外,则处于瞬时状态;在集合之内并且正在被Session调用,处在持久化状态;如果Session关闭,处在脱管状态。
对象的状态发生改变时,对象在内存中的地址并未发生改变,仍然是同一对象,只是对象与数据库的关系发生改变。
session.save(Object obj);
Object obj=(Object)session.get(Object.class,Serializable id);
Object obj=(Object)session.get(Object.class,Serializable id);
返回对象的代理,在对象被调用时,才向数据库发送SQL语句。
Object obj=session.get(Object.class,Serializable id); session.delete(obj);
Object obj=session.get(Object.class,Serializable id); obj.setter();//调用setter方法修改对象属性
事务提交是Hibernate中唯一的同步时间点,事务提交时将Session缓存中的数据同步到数据库。
遇到Query查询、flush方法、事务提交时,执行删除与修改操作更新session缓存中的内容,只有在事务提交时才同步到数据库。
刷新时间是为了在事务提交前执行针对数据库的操作,减少访问数据库的次数,降低数据库负担,只对删改操作有效,对插入与加载无效,对清空缓存无效。
修改缓存中已有的对象,比如修改对象属性值,删除对象,不会清空缓存,不会同步到数据库,不影响那些与缓存内容无关的操纵,比如save\get操作不受flush影响,立即执行。
同步时间点与刷新时间点都受快照的约束。
标签:行记录 nal factor 并且 语句 hiberna 删除对象 快照 image
原文地址:http://www.cnblogs.com/tonghun/p/7209065.html