hibernate 笔记

来源:互联网 发布:mac怎么打开itunes 编辑:程序博客网 时间:2024/06/05 16:59

1SessionFactory

  1. 用来产生和管理session
  2. 通常情况下应用只需要一个SessionFactory(除非访问多个数据库的情况)
  3. 关注两个方法 openSession getCurren tSession
    1. openSession每次都是新的,需要close
    2. getCurrentSession从上下文找,如果有,用旧的,如果没有,建新的
      1. 用途,界定事物边界
      2. 事物提交自动close
      3. current_session_context_class(jta(java transaction api) thread)
        1. thread使用connection管理事物
        2. jta用于分布式事物(由中间件厂商提供

2、产生SessionFactorysession方法

Configurationconfig = new Configuration().configure();

ServiceRegistryresgistry = newStandardServiceRegistryBuilder().applySettings(config.getProperties()).build();

SessionFactorysf = config.buildSessionFactory(resgistry);

Sessionsession = sf.openSession();

3、对象的三种状态

  1. 三种状态的区分关键在于
    1. 有没有ID
    2. ID在数据库中有没有
    3. 在内存中有没有(session缓存)
  2. 三种状态
    1. transient:内存中有对象,没有ID,缓存中也没有
    2. persistent:内存中有,缓存中有,数据库有(ID)
    3. detached:内存中有,缓存没有,数据库有(ID)

4、get 和 load 的区别

  1. 不存在记录时表现不一样
  2. load 返回的是代理对象,等到真正用到对象的内容才发出sql语句
  3. get 直接从数据库加载,不会延迟

5、update

  1. 用来更新detached对象,更新完后转换为persistent对象
  2. 更新transient对象会报错
  3. 更新自己设定id的transient对象可以(数据库存在该记录)
  4. 更新部分更改的字段
    1. xml设定property标签的update属性,annotation设定@Column的updatable属性,这种很少用,不灵活。
    2. 使用xml的dynamic-update,JPA1.0没有对应的属性
      1. 同一个session可以,跨session不行,可以使用merge
    3. 使用HQL(EJBQL建议),session.createQuery("")

6、clear、flush

  1. clear:无论是load还是get,都会首先查找缓存(一级缓存),如果没有才回数据库查找,调用clear可以强制清除session缓存
  2. flush:可以强制从内存到数据库的同步

7、关联关系中的CRUD

  1. 设定cascade可以设定在持久化时对关联对象的操作
  2. cascade仅仅是帮我们省了编程的麻烦,不要把它的作用看的太大
    1. cascade属性指明做什么操作的时候关联对象时绑在一起的
    2. merge=save+update
    3. refresh = A里面需要读B改过之后的数据
  3. 铁律:双向关系在程序中要设定双向关联
  4. 铁律:双向要设定mappedBy
  5. fetch
    1. 铁律:双向不要两边设置EAGER(会有多余的查询语句发出)
    2. 对多方设置EAGER要谨慎,结合具体应用,一般用LAZY不用EAGER;特殊情况(多的一方数量不多的时候可以考虑,可以提高效率)
  6. 要想删除或更新,先做load,除了精确知道ID之外
  7. 如果想消除关联关系,先设定关联为null,在删除对应记录,如果不删除,就变为垃圾数据
  8. O/RMapping编程模型
    1. 映射模型
      1. jpa annotation
      2. hibernate annotation extension
      3. hibernate xml
      4. jpa xml
    2. 编程接口
      1. jpa
      2. Hibernate
    3. 数据查询语言
      1. HQL
      2. EJBQL

8、1+N问题

  1. lazy、BatchSize、join Fetch

9、list和iterate区别

  1. list取所有
  2. iterate先取ID,用到时在根据ID来取对象
  3. session中,list第二次发出,仍会查询数据库
  4. list第二次发出,首先找session缓存

10、一级缓存、二级缓存和查询缓存

  1. 什么是缓存? 在内存中开辟一块空间
  2. 什么是一级缓存? session级别的缓存
  3. 什么是二级缓存? SessionFactory级别的缓存,可以跨越session的存在
    1. 打开二级缓存
      1. xml配置
        1. 3.3的配置:

<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>

  1. 注解@Cache
  1. 什么数据适合放二级缓存
    1. 经常被访问的数据
    2. 改动不大的数据
    3. 数据量不大的数据
  2. load默认使用二级缓存,iterate默认也使用二级缓存
  3. list默认往二级缓存加数据,但是查询的时候不用
  4. 要用查询表缓存(query),必须打开二级缓存,查询缓存配置
    1. <property name="hibernate.cache.use_query_cache">true</property>
    2. 调用Query的setCacheable(true)方法指明使用查询缓存
  5. 缓存算法
    1. LRU、LFU、FIFO
      1. Least Recently Used
      2. Least Frequently Used(命中率最高)
      3. First In First Out
    2. 设置:meneoryStoreEvictionPolicy="LRU"(ehcache)

11、事务并发处理

  1. 事务ACID
  2. 悲观锁(使用数据库的锁 FOR UPDATE)
  3. 乐观锁,使用程序的锁(@version),版本控制


0 0
原创粉丝点击