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

0 0