OgnlValueStack包含:
一个root (对象栈)--------?ArrayList
一个context---?Map(跟确切地说是一个ognlcontext)
Ognlcontext: 包含
一个默认的顶层对象root (是OgnlValueStack中root对象的一个拷贝)
此处的值:不需要# 直接通过元素名访问。
一个map 对象
此处的值:需要#访问。
Valuestack在ActionContext中,而ActionContext在ThreadLocal中,所以可以保证数据的安全性。
Hibernate:
1.Jdbc与hibernate比较:
Jdbc :优点效率高,连接池代码繁琐,没有数据缓存。 Hibernate:优点面向对象编程,数据缓存
提出了缓存机制,这样可以使访问数据的效率提高很大。
缺点:大量数据的条件下不适合,
程序员对hibernate生成的sql语句不可控。对于sql优化要求很高的项目中,不适合。
2.对象关系映射(Object Relational Mapping,简称ORM)
是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
3.理解sessionFactory
1.在sessionFactory中存放着配置文件和所有的映射文件。 2.sessionFactory是一个重量级的类。 3.一个数据库只能有一个sessionFactory。 4.一个配置文件只能连接一个数据库
5.只要创建了sessionFactory,表就创建完了
6.sessionFactory存放的数据是共享的,但这个类的数据本身是线程安全的。 7.sessionFactory是一个接口,其实现类是:sessionFactoryImpl
SessionFactory线程安全的 Session 线程不安全
采用getCurrentSession()创建的Session会绑定到当前的线程中去、而采用OpenSession()则不会。
采用getCurrentSession()创建的Session在commit或rollback后会自动关闭,采用OpenSession()必须手动关闭。
4.对象的状态
简单理解:内存中有两个区域一个区域与一般内存一样另一个是hibernate内存区域 位于一般内存区域的对象:临时对象
位于hibernate内存区域的对象:持久化对象
处于hibernate内存中的数据被清除后,被清除的对象叫做游离对象。
持久化对象有3种状态:
持久化状态(Persist):
Session的save方法把临时对象转变为持久化对象。
Session的load()或get()方法返回的对象总是处于持久化状态。
Session的update(),saveOrUpdate()方法使游离对象转变为持久化对象。
当一个持久化对象关联一个临时对象,在允许级联保存的情况下,session在清理缓存时会把这个临时对象也转换为持久化对象。
OID 不为 null(oid对象标识符) 位于 Session 缓存中
持久化对象和数据库中的相关记录对应
Session 在清理缓存时, 会根据持久化对象的属性变化, 来同步更新数据库
在同一个 Session 实例的缓存中, 数据库表中的每条记录只对应唯一的持久化对象
临时状态(transient):
当通过new语句创建了一个java对象,它处于临时状态。此时不和数据库中的任何记录对应。
在使用代理主键的情况下, OID 通常为 null 不处于 Session 的缓存中 在数据库中没有对应的记录
游离状态(Detached)
当调用session 的close()方法时,session的缓存被清空,缓存中的数据所有持久化数据都变为游离对象。如果在应用程序中没有引用变量引用这些游离对象,它们就会结束生命周期。
Session 的evict()方法能够从缓存中删除一个持久化对象,使他变成游离状态。当session的缓存保存了大量的持久化对象,会消耗许多内存空间,为了提高性能,可以考虑调用evict() 方法,从缓存中删除一些持久化对象。 OID 不为 null
不再处于 Session 的缓存中
一般情况需下, 游离对象是由持久化对象转变过来的, 因此在数据库中可能还存在与它对应的记录
saveOrUpdate:
该方法同时包含save和update方法,如果参数是临时对象就用save方
法,如果是游离对象就用update方法,如果是持久化对象就直接返回(不执行)。 如果参数是临时对象就用save方法
5.映射关系:
主键产生机制:Increment,Identity,Sequence,。。。。。。。
一对多:classes student
Student.java 中 private Classes classes;
Classes.java 中 private Set
Classes.hbm.xml
多对多:Course student Student.hbm.xml
Course.hbm.xml
一般一对多的涉及到关系的维护:都通过多的一方来维护。避免发出update语句 Inverse:不维护关系 false 维护
Cascade: 级联
6.一级缓存&&二级缓存
一级缓存:一级缓存在session中存放存放私有的 session 级别的缓存
只要一个对象是持久化对象,数据就在一级缓存中。 把缓存中的数据同步到数据库:session.flush()
把数据库中的数据同步到一级缓存:session.reflush() 只能同步一个对象 清空一级缓存:session.clear();
二级缓存:二级缓存在sessionFctory中存放存放共享的sessionFctory级别的缓存 存放很少被修改的数据,数据可以公开的 EhCache,OSCache,JBossCache
查询缓存:依赖于二级缓存,所以必须开启二级缓存才可用。
查询数据时:如果查询缓存存在。则直接返回。否则到数据库查询,然后把查询结果放在查
询缓存。
缓存的作用:
1。减少访问数据库的频率。
2。保证缓存中的对象与数据库中的相关记录保持同步。
For(inti=0;i<10000;i++){ Session.save(object);
}
Hibernate:
For(inti=0;i<10000;i++){ If(iP==0) Session.flush();//同步 Session.clear();//清空
}
Session.save(object);
7.抓取策略:必须是一个对象操作其关联对象。
当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候, Hibernate如何获取关联对象的策略。
抓取策略可以在O/R映射的元数据中声明,也可以在特定的HQL 或条件查询(Criteria Query)中重载声明。
连接抓取(Join fetching) - 一次性把两张表的数据查出来
查询抓取(Select fetching) - 一个一个加载,先加载一个,在加载关联的。
子查询抓取(Subselect fetching) - 通过需求分析判断,如果存在子查询,则选择。 批量抓取(Batch fetching) -
8.懒加载