2009年5月9日星期六

Hibernate简要笔记

1.
mysql engine:innoDb 支持事务, 其他的有些不支持事务,在Hibernate中默认事务是不开启的和jdbc

相反,所以如果数据不支持引擎,对hibernate来说插入数据都是有效的。

2.
save 与 persist。 没开事务的时候 persist不会插入(insert)数据。

3.
update,没记录时会抛异常

4.
transient:数据库里没相应记录与之对应,new出来的,没id值
persistent:数据库里有相应记录与之对应,并与session关联,有id值
detached:数据库里没相应记录与之对应,但是没有session与之关联,有id值

看图。

5.
hibernate查询的方式:

1)HQL

2)Criteria

6.
java实体类或属性名与数据库关键字冲突问题。
1)改表名
2)表名加反引号 ` , 字段名
3)表名加 [] 括起来 , 我自己摸索出来的。

7.
hql 命名参数, 把 name=? 代替 为 name=:name  ,这样不需要 依赖于顺序了

8.
many to one: 基于对象建模,对象

one to many: set<对象> 使用泛型,配置的 one-to-many中需要配置class属性

one to one :foreign,constrained约束

many to many: 转成 2个 one to many的,连接表。性能问题。

component: 组件

9.
集合:PersitentSet。

10.
cascade :用来说明当对主对象进行某种操作是否对其关联的从对象也做类似的操作
        none、all、save-update、delete、lock、refresh、evict、replicate、
        persist、merge、delete-orphan。一般不在 many to many,mang ot one中设置级联
    ,在one ot one 和 one to many 中设置。
       级联一般配置在 set list 等 中。
        在one的一端!!!
inverse :表示是是否放弃维护关联关系。one to many 维护关联关系就是更新外键,
        many to many 维护关联关系就是在中间表(关联表)增减记录

           在父对象的一端或者one的一端放弃 维护关联关系(true)。关系由多的一段维护。
           对象模型关联的设置。
           可以提升性能。

           在list 和 array中不能出现 invers属性。有序的集合必须维护关系。
           多的一端不能设置inverse属性。

11.
继承映射。三种策略,或者四种。

1)一张表一个继承树,效率高,增加子类需修改表结构,子表字段不能非空字段
    subclass。子类
    discriminator。鉴别器。
2)每个类一张表,一个父表,多个字表。
    joined - subclass 。table。 key 外键。
3) 1)2)混合使用,join
4)每个类都有一张独立表。

    union - subclass。
12.懒加载, 提高性能
1)
load 方法。 懒加载。 lazy,load。

asm,cglib,不能是final的 ,如果是的话,lazy 失效。

Hibrenate.initialize(Class claaz);
2)one to one ,lazy(主对象不会出现,从对象出现)
   a。lazy!=false,
   b。constrained = true // 从对象
   c。fetch = select
分多次查询,即在需要的时候查询,fetch如果为join的话,lazy就失效了。
访问的时候就查询。

相关的属性什么时候查询。

3)one to many ,many to mangy , lazy
  a。lazy!=false
  b。fetch = select

4)many to one。lazy 缺省是lazy的
  a。lazy!=false
  b。fetch = select

5)懒加载对象都是代理对象,getId,getClass不会触发懒加载,Initialize(proxy)方法

13.
Cache分析。。
1)session里有cache,session不关闭,2次同一个get。session生命周期比较短,起缓存作用比较小
   save update load CreateQuery(不行), 清理,clear(全部) evict(一条)。
   一级缓存没有限制。大数据量很容易内存溢出。
2)sessionFactory里也有,二级缓存,配置文件配置。

   cache.use_second_level_cache : true.
   cache.provider: class(HashTable,OSCache,Ehcache,TreeCache,SwarmCache)
   OsCache 配置文件。
 
  每一个类需要缓存的设置:
  cfg中: class cache, usage:read only ,  read write, nonstrict-read-write,

transactional。
  hbm中:Cache。命中率,session。clear()清除一级缓存

3)打开统计信息:
   generate_staticstics : true.

   或得统计信息:SessionFactory。getStastics()返回的是Statistics类里面有不少描述信息;

   清理   evict()
 
  CreateQuery :难以利用缓存。命中率低。

14.
分布式缓存,集群。,读取快,更新慢。

OScache支持。

中央缓存。更新快,读取慢,memcache

数据缓存的条件。
a。读取的次数大于修改的次数。
b。数据量不能太大
c。对数据有独享的控制权
d。可以容忍出现无效的数据


15.
事务相关。

JDBC事务一个数据库,JTA事务-分布式事务-跨数据库,JTA容器。

JNDI:类似注册表。

事务边界:事务开始,事务提交,事务回滚。

16.
opensessionInView
    页面渲染的时候,session能够打开
    Servlet Filter 里使用Session, getLocalSession
ThreadLocal 局部线程变量

要从SessionFactory中获得GetCucrrentSession的话需要配置
current_Session_context_class。否则会异常。
值为thread(ThreadLocal)或者jta(jta事务管理器)。


17.
乐观锁:hibernate用version和timestamp控制实现
悲观锁:数据库实现

18.
Session是非线程安全的。周期短,尽量晚的获取,尽量早的释放。他代表一个数据库连接。
SessionFactory是线程安全的。一个数据库对应一个SessionFactory,周期长。


19.
flush:一级缓存和数据库同步


20.

HQL:
查询多个对象,返回的是对象。要返回多个列,返回Object[]。


根据ID查询时,get、load查询和CreateQuery(不能利用缓存)的差别:性能~~


21.

N+1查询:iterator。
懒加载:fetch-》join,利用缓存。



detachedCriteria:离线查询,动态SQL。

22.
监听器。
拦截器与事件:Interceptor接口。

实现接口,
cfg,里配置even

推荐用 监听器。

23.
(1)使用sql,不用hql。
Query createSQLQuery(String).操作的是表,跟平时操作sql一样。

返回的是对象。

(2)使用Query节点,属性 name(可以放在class里面也可以放在外面,在里面的时候需要加上包的全路径

名),,即命名查询。把hql,放到hbm。xml文件里统一管理。
类似ibatis。

Query getNamedQuery(String name);

(3)
sql-query节点。里面使用的是sql。

24.
保存Domain对象,可以用Map代替。将对象转为xml。


25.
Best practice。

不适合的场景:
1)OLAP,一查询为主,相反适合OLTP
2)关系模型设计不合理的,
3)数据量巨大,性能要求苛刻。

1)细粒度设计持久类 component
2)id
3)每个持久类一个映射文件
4)映射文件作为资源加载
5)自然组件,覆盖hascode,equal
6)考虑把查询串发在hbm。xml配置文件里。
7)少用?多用变量名
8)不要自己管理jdbc 连接。
9)考虑使用自定义类型,UserType
10)性能瓶颈使用硬编码的jdbc实现
11)session flush 成本比较高,尽量不手动管理。交给hibernate
12)在三层架构中使用托管对象 detached object
13)在2层结构中,考虑使用长 持久上下文
14)不要把异常看成可恢复的,catch 回滚是,必须throw出来,让上层调用者知道。
15)对于关联有限考虑lazy fetching。
16)避免open session in view 的问题。
17)考虑把hibernate 代码从业务逻辑代码中抽象出来。
18)不要使用怪异的连接映射
19)偏爱双向关联。单项管理更难查询???

--自助者天助之--

--
道不远人,人自远。

没有评论: