Web框架梳理:第二章:Hibernate入门、Hibernate关系映射和查询、hibernate注解开发
来源:互联网 发布:手机淘宝怎么备注留言 编辑:程序博客网 时间:2024/06/06 09:52
1.关联关系映射
我们在JDBC中进行多表连接的时候一般用join,JDBC是表对表的连接;
在Hibernat中关联映射的是对象。
框架是ORM框架,关系对象映射。
几种不同的映射关系:
1) 一对一
例如:
student
sid(pk) sname sex
101 张三 男
102 李四 女
paper
pid(pk) pdesc sid(fk+uk)
1 高中学生证 101
2 大学学生证 102
一个学生用户一张学生卡。
配置关系属性的四要素: ##
a.配置关系属性名 关系属性也是一个属性 需要配置 b.配置关系属性对应类名(底层实际要找对应的表名) c.配置外键 直接配置的 column="sid" 间接配置: property-ref="属性名" d. 级联 cascade 选配 操作一方 是不是要影响另外一方 如果需要影响另一方 配置级联 不需要的影响另一方 不需要配置级联.
2)一对多
3)多对多
张三 男paper pid(pk) pdesc sid(fk+uk) 1001 高中学生证 101
Student:
Paper paper;
set/get
Paper:
Student student;
set/get
Student.hbm.xml:
<class name="Student" table="student"> <!--配置关系属性--> <one-to-one name="paper" class="Paper" property-ref="student" cascade="none/save-update/all/delete" > </class>
Paper.hbm.xml:
<class name="Paper" table="paper"> <!--配置关系属性--> <many-to-one unique="true" name="student" class="Student" column="sid" cascade="none"> </class>
b.共享主键一对一:
person(人) pid(pk) pname psex 101 张三 男 102 李四 女
2) 一对多:
grade gid(pk) gname gdesc 1 3a 2 3b student sid sname sex gid(fk) 10 张三 男 1 20 李四 女 1 passport(护照) pid(pk+fk) ptype expire 101 美国护照 2 102 英国护照
扩展:
设计表的原则(规范):
三范式 第一范式:字段不可分割的 原子性的 第二范式:每个表必须要有唯一标识的列,表中必须有主键 第三范式: a表的的一列参照了b的某列,a表的别的列参照b表的其他列
1.多对多映射(*):
student
sid(pk) sname sex
101 张三 男
102 李四 女
sc(关系表 中间表)
sid(fk) cid(fk)
101 10
101 20
102 10
102 20
course
cid(pk) cname
10 struts2
20 hibernate
sql:
查询张三选了哪些课程(课程名称):
select s.sname,c.cname
from student s join sc on s.sid=sc.sid
join course c on c.cid= sc.cid where s.sname=’张三’;
select s.sname,c.cname
from student s join sc on s.sid=sc.sid and s.sname=’张三’
join course c on c.cid= sc.cid ;
2.Hql查询(*):
Hibernate Query language
面向对象查询语句 类名 属性名
基本原则: sql hql 表 类名 字段 属性名
hql:
select from where group by having order by
sql与hql区别:
* 不能独立使用 但是可以组合使用
1.多对多映射(*):
student sid(pk)snamesex 101 张三 男 102 李四 女 sc(关系表 中间表) sid(fk)cid(fk) 101 10 101 20 102 10 102 20 course cid(pk) cname 10 struts2 20 hibernate
sql:
查询张三选了哪些课程(课程名称):
select s.sname,c.cname
from student s join sc on s.sid=sc.sid
join course c on c.cid= sc.cid where s.sname='张三'; select s.sname,c.cname
from student s join sc on s.sid=sc.sid and s.sname=’张三’
join course c on c.cid= sc.cid ;
2.Hql查询(*):
Hibernate Query language
面向对象查询语句 类名 属性名基本原则: sql hql 表 类名 字段 属性名
hql:select from where group by having order by
sql与hql区别:
* 不能独立使用 但是可以组合使用 hql中不能使用 on 在hql连接的时候 要使用关系属性来连接.
3.Hibernate下的分页(*):
query.setFirstResult(0);//起始序号
query.setMaxResults(2); //每页大小
4.命名hql查询: (了解)
在*.hbm.xml中 为hql语句起个名字,
将hql语句统一配置在配置文件中,
以后方便修改维护.
Query query = getNamedQuery("hql的名字");
hql语句
5.Criater (了解)
编程 查询 风格:
不需要任何语句(sql,hql),
将查询的条件 用对象(调用方法)来封装.
6.延迟加载(**):
类级别:
>
load(): 默认是延迟加载
返回的是代理对象 用了代理模式(会生成代理对象)
查询一个不存在的主键时,会报错
get: 立即加载 (没有用代理模式,不会有代理对象)
返回的是真实对象
查询一个不存在主键时,不会错,输出null
load实现原理:
Emp_javassist_0 extends Emp{ getEname(){ // 发送sql查询 }} list(): 立即加载 iterator(): 延迟加载
关联级别:
7.Hibernate的对象状态(记忆):
临时状态(瞬时状态) 临时对象 Transient 随时有可能被回收器 刚刚new出来的 在表中没有与之对应的记录. Emp e = new Emp();持久状态:Persistent 不能被回收的 表中有与之对应的记录 被session管理了(这个对象处于session缓存中) session.save(e); session.get(Emp.class,1001);游离状态(托管状态):Detached 不在处于session缓存区了(不被session管理了) 在表中一般有与之对应的记录 可以被回收的 session.close(); session.clear();//将session缓存中的数据全部清空了
8.hibernate的缓存(**):
提升性能
将一个对象查询出来后,放入到缓存中, 下次再需要这个对象,就不需要在发送sql查询,直接在缓存中就查到.
1) 一级缓存: session级别缓存 默认就是开启的
session对象在 session缓存就存在session关闭了 session缓存释放了 evict(): 只清除指定的数据 clear():清空缓存中的所有数据
2)二级缓存 SessionFactory级别缓存 缓存范围更大
跨session缓存问题.
默认是关闭的
a.启用二级缓存 并且指定具体的提供商
<property name="cache.use_second_level_cache">true</property> <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
b.在src下创建ehcache.xml
配置二级缓存具体管理办法: <cache name="sampleCache1" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true" />
c.在需要的*.hbm.xml:
3)查询缓存:
一级或者二级缓存 只能缓存根据主键查询的对象,
如果通过写hql语句查询的对象,需要放在缓存中,
需要放入查询缓存中.
在hibernate.cfg.xml:
false
在代码中:
query.setCacheable(true);
补充:hibernate注解开发:
1) *.hbm.xml 映射文件
2)注解开发(替换*.hbm.xml)
根据表生成 hbm.xml
根据表生成 注解
根据注解生成表结构.
@Entity
@Table
@Id
@Basic
@Column
@GeneratedValue
@OneToMany
@OneToOne
@ManyToMany
@ManyToOne
- Web框架梳理:第二章:Hibernate入门、Hibernate关系映射和查询、hibernate注解开发
- Hibernate映射关系梳理
- hibernate注解 关系映射
- Hibernate注解关系映射
- Hibernate注解关系映射
- Hibernate注解关系映射
- Hibernate关系注解映射
- Hibernate映射关系注解
- hibernate关系注解映射
- hibernate注解关系映射
- Hibernate框架关系映射
- Hibernate Annotation注解和关系映射
- hibernate 映射关系注解实现
- hibernate映射关系级别注解
- hibernate常用注解&映射关系
- Hibernate各种关联映射关系梳理
- 自动化Hibernate映射和查询 --- Java web
- SSH:Hibernate框架(Hibernate查询排序和组件映射)
- 一个关于宠物的小代码
- 一个简单的逆向
- OJ习题acm求数列的和
- CF_671B Robin Hood(二分)
- HDU 1008
- Web框架梳理:第二章:Hibernate入门、Hibernate关系映射和查询、hibernate注解开发
- linux查看防火墙状态及开启关闭命令
- 从数据库动态加载菜单栏
- 带翻页标志的横向滑动GridView
- PAT(basic level) 1039 到底买不买(20)
- Longest Substring Without Repeating Characters
- jq基础笔记
- 【C/C++】报错问题积累
- linux技术进阶蓝图纲要