Hibernate 学习笔记
来源:互联网 发布:nuts二战知乎 编辑:程序博客网 时间:2024/05/02 04:33
Hibernate 学习记录【20120815】
hibernate 配置 Helloword 【20120815】
1.到hibernate 官网上下载Hibernate 的jar ,hibernate-distribution-3.3.2.GA-dist.zip,hibernate-annotations-3.4.0.GA
2. 新建项目,导入jar包,Hibernate3.jar,hibernate-distribution-3.3.2.GA\lib\required下的所有jar,以及hibernate- annotations- 3.4.0.GA 中的Hibernate-annotation.jar,lib下的,ejb3-persistence.jar,hibernate-commons- annotation.jar,lib\test下的 hibernate- cllextions.jar
3.创建hibernate.cfg.xml, 里面的配置到hibernate-distribution-3.3.2.GA-dist\hibernate-distribution-
3.3.2.GA\documentation\manual\zh-CN\html_single ,下的文档中copy 修改下即可,
4. 创建表,和实体类,配置实体类名.hbm.xml,里面的内容可在上述文件中copy , 修改即可,
Hibernate annotation id 的配置方法【20120815】
annoation 联合主键的方法,
1, @Id @Embaddable
2, @EmbaddedId
3, @Id IdClass
具体方法请查看annoation 文档
Hibernate coreApI 【20120815】
三种状态:
- 瞬时: 内存中有 , 缓存中没有, 数据数中没有 没有id
- 持久状态: 内存中有, 缓存中有, 数据库中有, 有id
- 脱管状态: 内存中有, 缓存中没有, 数据库中有, 有id
- 不存在记录时, 表现不一样, load 不会报错, get 报异常。
- load 返回的是代理对象,等到真正用到对象时,才会发送sql 语句
- get 是直接发送sql 语句查询数据库, 而不会延迟,
clear()方法,
- 无论是gat 还是load方法,首先都会去session缓存中去查找,如果没有才会去数据库中查找,调用clear()方法可 以强行清 除session 缓存
- 调用flush()方法,可以强行进行缓存和数据库同步
Hibernate 关系映射【20120815】
- 单项One2One @OneToOne @JoinColumn(name="指定外键的名称")
- 双向One2One 双方都加@OneToOne
- 注意任意双向关联 必须的加 mappedBy
- One2One 双向 组合主键, @@OneToOne@JoinColumns ({@JoinColumn (name="组合主键名称(自己定义)" ,referencedColumnName= "对应属性名称"),@JoinColumn (name="组合主键名称(自己定义)" ,referencedColumnName= "对应属性名称")})当然不要忘了 组合主键的使用
- hibernate的 联合组建,使用@Embedded
- 单项One2Many 一方用Set,@OneToMany @JoinCoiumn(name="")
- 单项Many2One @ManyToOne @JoinColumn(name="")
- 双向Many2One 将单项和一起就OK, 记得在主控方加mappedBy, 一般多的一方作为主控方
- 单项Many2Many @ManyToMany 设置中间表 @JoinTable(name="中间表名" ,joinColumns={@JoinColumn (name="当前表对应的字段名称" )},inverseJoinColumns={ @JoinColumn (name="与之对应的表的字段名称" )})
- 双向ManyToMany 就是在两边都加 @ManyToMany ,记得加MappedBy
Hibernate 查询
- NativeSQL>HQL>EJBQL(JQL)> QBC(Query by creitria) >QBE(Query by Example)
1+N问题
- 主要出现在OneToMany 中, 比喻,load 一个对象时,本只需一个select , 但是这个对象里面关联了另一个对象 这样就会额外的多发出N条语句,这就是1+N问题。
- 解决办法 a)Lazy b)batchsize c) Join fatch ,a ,c 用的比较多,
Iterator 和 list 的区别
- list在查询时一次性的全部取出所有数据
Iterator 先取出所有的ID , 等正真使用对象时在根据id去数据库中查 - list不会去查session缓存(一级缓存)中的值,但是它会默认往二级缓存中放数据,查询时也不使用二级缓存。
Iterator 首先去sesion缓存中去查找,session缓存中没有去二级缓存中查,都没有才去数据库中去查找。 - 使用建议, 使用时可以用list , 二次使用时用可以用Iterator ,更具情况而定
Hibernate 缓存
- 一级缓存,也称Session级别缓存。
- 二级缓存,也称SessionFactory缓存
- 经常被访问的数据
- 改动不大,不经常使用过修改的数据, 例如 , 用户的权限,组织机构等数据
- 数量有限的数据
Hibernate 使用 - 在Hibernate.cfg.xml文件中添加打开二级缓存的配置
- 添加二级缓存的特有的配置文件,并导入jar包。
- 使用时使用注解@cahe 具体方法请查看KPI .
- 在Hibernate.cfg.xml中打开查询缓存,(依赖于二级缓存)
- 设置使用查询缓存,用.setCacheable(true)
缓存的算法
- LRU:最近很少使用的(根据使用时间判断)
- LFU:最近不常用的(命中率高低)
- FIFO:
事物
事物的特性ACUD:
- A事物的原子性
- C一致性
- U独立性
- D持久性
事物的并发
- 脏读:读到另一个事物没有提交的数据
- 不可从复读:同一事物两次读取的数据不一致
- 幻读:主要在插入和删除中出现
事物的隔离机制
- 1 read_uncommitted
会出现:脏读,不可从复读,幻读 - 2 read_committed
会出现:不可从复读,幻读 - 4 repeatable read
- 8 serializable
可解决所有问题
一般情况下会设置为 read_committed
Hibernate 设置事物隔离机制方法:配置文件中加,Hibernate.comecion.isolation=2
一般设置为2 即 read_commintted。
解决不可从复读(一般不考虑幻读)可以用 乐观锁和悲观锁 ,
- 悲观锁: 一个事物没有结束前别的事物不能修改,使用 在Load 中设置loadMode属性,具体可查API文档
- 乐观锁:利用版本号来识别,使用,在实体类中加version 字段,并给该字段加@Version注解
0 0
- 【Hibernate学习笔记】hibernate入门
- Hibernate学习笔记:初识Hibernate
- Hibernate Synchronizer 学习笔记
- hibernate学习笔记1
- Hibernate 学习笔记
- Hibernate学习笔记
- Hibernate 学习笔记
- Hibernate 实例学习笔记
- Hibernate学习笔记(1)
- hibernate学习笔记
- Hibernate学习笔记(一)
- Hibernate学习笔记
- Hibernate学习笔记!- -
- Hibernate学习笔记(一)
- Hibernate学习笔记
- Hibernate 学习笔记
- Hibernate Synchronizer 学习笔记
- Hibernate 学习笔记
- DIV_CSS布局问题:3个水平对齐布局的DIV,左右固定宽,中间宽度自动填充
- shell常用命令
- 【前端学习笔记】深入学习Javascript:DOM机制
- Android4.4深入浅出之SurfaceFlinger总体结构
- js前台分页显示后端JAVA数据响应
- Hibernate 学习笔记
- R语言饼图的绘制
- Yslow-23条规则
- xcode 中的LLDB常用调试命令
- webdriver查找元素的几种方法
- HDU 5344 多校赛1002 MZL's xor
- BaseAdapter的使用步骤以及setTag和getTag的作用
- Android SDK Mirror
- 二叉树非递归遍历