1、SessionFactory
- 用来产生和管理session。
- 通常情况下应用只需要一个SessionFactory(除非访问多个数据库的情况)
- 关注两个方法 openSession getCurren tSession
- openSession 每次都是新的,需要close
- getCurrentSession 从上下文找,如果有,用旧的,如果没有,建新的
- 用途,界定事物边界
- 事物提交自动close
- current_session_context_class(jta(java transaction api) thread)
- thread 使用connection管理事物
- jta 用于分布式事物(由中间件厂商提供 )
2、产生SessionFactory与session方法
Configurationconfig = new Configuration().configure();
ServiceRegistryresgistry = newStandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
SessionFactorysf = config.buildSessionFactory(resgistry);
Sessionsession = sf.openSession();
3、对象的三种状态
- 三种状态的区分关键在于
- 有没有ID
- ID在数据库中有没有
- 在内存中有没有(session缓存)
- 三种状态
- transient:内存中有对象,没有ID,缓存中也没有
- persistent:内存中有,缓存中有,数据库有(ID)
- detached:内存中有,缓存没有,数据库有(ID)
4、get 和 load 的区别
- 不存在记录时表现不一样
- load 返回的是代理对象,等到真正用到对象的内容才发出sql语句
- get 直接从数据库加载,不会延迟
5、update
- 用来更新detached对象,更新完后转换为persistent对象
- 更新transient对象会报错
- 更新自己设定id的transient对象可以(数据库存在该记录)
- 更新部分更改的字段
- xml设定property标签的update属性,annotation设定@Column的updatable属性,这种很少用,不灵活。
- 使用xml的dynamic-update,JPA1.0没有对应的属性
- 同一个session可以,跨session不行,可以使用merge
- 使用HQL(EJBQL建议),session.createQuery("")
6、clear、flush
- clear:无论是load还是get,都会首先查找缓存(一级缓存),如果没有才回数据库查找,调用clear可以强制清除session缓存
- flush:可以强制从内存到数据库的同步
7、关联关系中的CRUD
- 设定cascade可以设定在持久化时对关联对象的操作
- cascade仅仅是帮我们省了编程的麻烦,不要把它的作用看的太大
- cascade属性指明做什么操作的时候关联对象时绑在一起的
- merge=save+update
- refresh = A里面需要读B改过之后的数据
- 铁律:双向关系在程序中要设定双向关联
- 铁律:双向要设定mappedBy
- fetch
- 铁律:双向不要两边设置EAGER(会有多余的查询语句发出)
- 对多方设置EAGER要谨慎,结合具体应用,一般用LAZY不用EAGER;特殊情况(多的一方数量不多的时候可以考虑,可以提高效率)
- 要想删除或更新,先做load,除了精确知道ID之外
- 如果想消除关联关系,先设定关联为null,在删除对应记录,如果不删除,就变为垃圾数据
- O/RMapping编程模型
- 映射模型
- jpa annotation
- hibernate annotation extension
- hibernate xml
- jpa xml
- 编程接口
- jpa
- Hibernate
- 数据查询语言
- HQL
- EJBQL
- 映射模型
8、1+N问题
- lazy、BatchSize、join Fetch
9、list和iterate区别
- list取所有
- iterate先取ID,用到时在根据ID来取对象
- session中,list第二次发出,仍会查询数据库
- list第二次发出,首先找session缓存
10、一级缓存、二级缓存和查询缓存
- 什么是缓存? 在内存中开辟一块空间
- 什么是一级缓存? session级别的缓存
- 什么是二级缓存? SessionFactory级别的缓存,可以跨越session的存在
- 打开二级缓存
- xml配置
- 3.3的配置:
- xml配置
- 打开二级缓存
<propertyname="catch.use_second_level_catch">true</property>
<propertyname="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
4.3的配置:
<propertyname="cache.use_second_level_cache">true</property>
<propertyname="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
- 注解@Cache
- 什么数据适合放二级缓存
- 经常被访问的数据
- 改动不大的数据
- 数据量不大的数据
- load默认使用二级缓存,iterate默认也使用二级缓存
- list默认往二级缓存加数据,但是查询的时候不用
- 要用查询表缓存(query),必须打开二级缓存,查询缓存配置
- <property name="hibernate.cache.use_query_cache">true</property>
- 调用Query的setCacheable(true)方法指明使用查询缓存
- 缓存算法
- LRU、LFU、FIFO
- Least Recently Used
- Least Frequently Used(命中率最高)
- First In First Out
- 设置:meneoryStoreEvictionPolicy="LRU"(ehcache)
- LRU、LFU、FIFO
11、事务并发处理
- 事务ACID
- 悲观锁(使用数据库的锁 FOR UPDATE)
- 乐观锁,使用程序的锁(@version),版本控制