`
hao861002
  • 浏览: 87405 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hibernate复习第四天

阅读更多


回顾:
        PO的状态;
        cascade级联操作
        事务控制
一, 多对多
     Student 中有一个course的set 集合; Course中有一个Student的set 集合;
     数据库中没有办法直接表示多对多;
     必须有一个中间表;
     t_student       s_c         t_course
        sid          fsid   fcid        cid
        s1           s1     c1         c1
        s2           s1     c2        c2
        s3           s2     c1         c3
                       s3     c3
     多对多表:
create table t_student(
    sid number(11) primary key,
    name varchar(15) not null,
    stuId varchar(30) unique not null
 );
 create table t_course(
    cid number(11) primary key,
    name varchar(20) not null,
    courseId varchar(30) unique not null
 );
 create table t_enrollment(
    fsid number(11) references t_student(sid),
    fcid number(11) references t_course(cid),
    constraint many2many_534oijhsd34
    primary key(fsid,fcid)
 );
 
xml配置文件:

Student.xml
     <class name="Student" table="T_STUDENT">
  <id name="sid" column="sid">
   <generator class="native" />
  </id>
   <property name="name"  />
   <property name="stuId" />
   <set name="courses"  table="s_c"  cascade="save-update" inverse="true"><!--inverse="true" 写在一端就行了 -->
        <key column="fsid" />  <!--关系的另一方的表中与本表关联的外键字段; -->
        <many-to-many class="Course" column="fcid" /> <!-- Course表在中间表对应的外键字段-->
   </set>
    </class>
   
    多对多的set与一对多的set的意思不一样;这里映射的是中间表;
   
    属性的映射;
    name="courses" 对应的是一个表, 不是一个字段;
    key  表示关系的另一方(关联表)的外键;  column="fsid" 是Student表在关联表中的外键,
                                                            表示了一个一对多关系;
    class 是集合里元素的类型是Course; 多对多的关系, column="fcid"是Course表在关联表中外键,
                                                            表示了另外一个一对多;
   
    PO的角度;<many-to-many>  说明了多对多的关系;
     在设计的时候有可能将多对多关系变成一对多的关系;
     加一个选课类即可;学生和选课对象变成一对多的关系;
     一个选课对象只能对一个学生;一个学生对应多个选课对象;
    
 Course.xml 
 
    <class name="Course" table="T_COURSE">
  <id name="cid" column="cid">
   <generator class="native" />
  </id>
   <property name="name"  />
   <property name="courseId" />
   <set name="students" table="s_c"   cascade="save-update" >
        <key column="fcid" />
        <many-to-many class="Student" column="fsid" />
   </set>
 </class>
 
 二, 查询:
 
    传过来的搞不清楚是游离态还是暂态就用saveOrUpdate();
    Smalltalk 语言的语法; a 对象调用一个x方法返回a对象, 继续调用y 方法仍返回a 对象;
    返回void时也返回自己;
    s=(Student)session.createQuery("from Student s where stuID =: stuID")
                               .setString("stuID",stuID)
                               .uniqueResult();
    其他查询:
   
    "from Student s where stuName  like :stuName"
    连接表查询:面向对象的写法:
    "select s.name,c.name from Student s join s.courses  c"
 
    内连接:
        是保证两个表中所有的行都要满足连接条件;
        并不是所有的学生都有选课记录;
    外连接:
    会使用一方表中的所有记录去和另一表中的记录按条件匹配
   
    左右外连接 只是一种形式:与 (+) 本质上是一样的:  
    Left  Outer Join 包含了左表中的全部行(表达式中第一个表)
    Right Outer Join 包括了右表中的全部行(表达式中第二个表)
    也就是说在oracle中+号放在=右边相当于左连接,而+号放在=左边相当于右连接
   
    就地加工成 component (组件) NamePair : 细粒度对象;
    用作报表;
   
    对两个实体进行join操作;每一个学生选的所有课;
   
    "select new com.NamePair(s.name, c.name)from Student s join s.courses  c"
   
    用的时候才加载; 延迟加载;集合里的对象只是代理;session关闭就不行了;
    dao里写session不好;
   
三, 继承映射:
  1,  每个类建一个表
    特点:
           最接近于面向对象的结构;
           查询效率低,任何一个查询都要连接表;不利于做报表;
           在类比较多的情况下用这个;    
  2,  只有具体类才建表
    特点:
           查询效率也不是很高;
           对多态支持不好;
  3,  所有类对应一张表  (这种用的最多)
       特点:
           结构简单,就一个表,查询效率高,做报表也很方便;
           表太大,不太好维护,做索引不好做;子类的字段可以为空的;
  
   映射关系:
   Account:
   DebitAccount:  站在银行的角度,银行是借方;  courrency
   CheckAccount: 客户可以透支,银行是贷方;      overdraft
  
  
   3- 所有类一共一张表 -perhiarchy:  表里多了一个type字段;
 
       <discriminator  column="type" />   <!-- 区分字段,写在id后面,version前面; -->
       <subclass  name="DebitAccount" discriminator-value="D区分字段名">
              <property name="currency" />
       </subclass>
        模拟建表:
        create table t_account(
        aid number(15) primary key,
        ... //父类和子类的所有字段
        type varchar(20) not null
        );
       
   1- 一个类一个表-
        子表主键引用父表;
       
       <joined-subclass name="DebitAccount" table="t_DebitAccount">
           <property name="currency" />
           <key column="dfid" />    <!-- key的作用就是外键,子表引用父表的主键-->
       </joined-subclass>
  
           模拟建表:
           create table  t_account(
               aid number(11) primary key,
               ...//父类的所有字段
           );
       
           create table t_debitaccount(
                dfid number(11) primary key
                references t_account(aid),
                ...//子类的字段
            );
            create table t_checkaccount(
                cfid number(11) primary key
                references t_account(aid),
                ...//子类的字段
            );
    左外连接实现多态;
   
   2- 具体类对应表,父类没有表 -
        子类表中包含父类的字段和自己的字段;
        字段定义上有冗余,数据本身没有冗余;
        两个表之间没有关系; 单独写两个映射文件也是可以的;
      
        配置父类的属性;//两个表公用这些字段;名称相同;
        <union-subclass  name="DerbitAccount"  table="t_account_derbit">
            <property name="currency">
        </union-subclass>
       
        模拟建表:
        create table t_account_derbit(
                aid number(11) primary key,       
                ...//父类的属性    
                currency varchar(10) not null
                ...//子类的属性
         );

         create table t_account_check(
                pid number(11) primary key,
                 ...//父类的属性    
                 ...//子类的属性
         );
           
   多态怎么完成的:做了三个子查询;很复杂;效率低;
  
    映射关系原则:
    1)   不要求多态查询的话可以用一个具体类一个表;
    2)   要求多态查询的话,并且类少并且属性少用一个表;
    3)   要求多态类多并且大用一个类一个表;              
    一般都采取第二种;
  
   关联属性定义在父类比较好;配置时写在父类里;
   组件映射和集合映射明天讲;
  
四, session的安全性:
     把session作为参数时, 有可能在一个dao中用到了不同的session;这样很不安全;
     所以考虑和线程绑定,一个线程只用一个session;就能保证一系列的连续的任务用的是一个session;
     有一个绑定session和线程的工具:
     java.lang.ThreadLocal  是一个类;  jdk1.2就有了;
    
       原理:
           内部打开了一个Map;  key是线程对象, value是session对象;
           t1   object1
           t2   session1
       在t1线程里调用:TL.get();==>返回t1线程对应的object1;
       在t2线程里调用:TL.set(s1);==>设置t2线程的value为session1;
  
   在HbnUtil里维护一个静态的属性:
       private static final  ThreadLocal  threadLocal=new ThreadLocal();
       //一个线程一个session;
       public  static Session  getCurrentSession(){
            Session  s=(Session)threadLocal.get();//得到当前线程的session
            if(s==null){//如果为空,就打开一个session,并和当前线程关联起来;
                    s=sf.openSession();
                    threadLocal.set(s);
             }
             return  s;
        }
       //释放session;
       public static void close(){
            Session  s=(Session)threadLocal.get();
             if(s!=null && s.isopen()){//
                s.close(); //关闭当前线程的session
             }
             threadLocal.set(null);//和当前线程解除关联;
       }
      
       将dao中的属性session和 setSession()方法去掉;通过工具类得到当前线程的session;     
       当有一系列操作时, 用了几次session,保证是同一个session才能和数据库同步;
      
      
      

分享到:
评论

相关推荐

    hibernate达内五天复习笔记.pdf

    - 第四天可能讲解了HQL的使用,包括查询、更新、删除等操作。 - 第五天可能涉及了高级主题,如性能优化、缓存机制、Cascading和Lazy Loading等。 通过这五天的复习,读者将能够全面了解Hibernate的工作原理,熟练...

    复习hibernate

    本复习旨在深入理解Hibernate的核心概念、配置及常用API,帮助开发者提高开发效率。 一、Hibernate概述 Hibernate是Java领域中流行的ORM(Object-Relational Mapping)框架,它通过映射关系数据库与Java类,实现了...

    J2EE复习积累(六)-Hibernate4.2

    **J2EE复习积累(六)-Hibernate4.2** 在J2EE开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了Java应用程序与数据库之间的交互。本篇复习将聚焦于Hibernate 4.2版本,该版本在前一版本的基础上...

    韩顺平.2011版.hibernate_ppt.zip

    9. **缓存机制**:为了提高性能,Hibernate引入了缓存,包括第一级缓存(Session级别的缓存)和第二级缓存(SessionFactory级别的缓存),以及第三方缓存插件如Ehcache。 10. **实体状态**:Hibernate定义了四种...

    个人知识管理系统 Struts2.0 + Spring + Hibernate

    第四次:12小时 第五次:24小时 第六次:3 天 第七次:7 天 之后 :每15天 当然如果没有及时更新复习的话,下一次的复习更新时间会在上一次复习更新后顺延。 由于对页面样式了解不多,所以写出来的样式目前只在IE...

    Hibernate练习题

    - 有四种主要检索方式:HQL(Hibernate查询语言)、Criteria API、Query API(基于JPA的查询)、Native SQL。 12. 对象何时变为游离状态: - 在Hibernate中,当Session关闭时,所有与之关联的持久化对象变为游离...

    北大青鸟ACCP6.0 第三学期 Y2 JAVA方向 hibernate框架

    【北大青鸟ACCP6.0 第三学期 Y2 JAVA方向 hibernate框架】是一个针对Java开发者的学习资源,主要聚焦于Hibernate这一流行的关系对象映射框架。Hibernate作为一个强大的ORM(Object-Relational Mapping)工具,它简化...

    hibernate的配置视频

    9. **配置连接池**:为优化数据库连接的管理,通常会结合Hibernate使用第三方连接池,如C3P0、HikariCP等。这样可以在多线程环境下高效复用数据库连接,提高系统性能。 通过学习这个"hibernate操作视频",你将能够...

    SVSE-S3冲刺题-Hibernate笔试题

    "SVSE-S3冲刺题-Hibernate笔试题"这个标题表明这是一个针对SVSE(可能是软件版本、课程阶段或某个特定考试体系的缩写)第三阶段的冲刺复习资料,重点是Hibernate相关的笔试题目。Hibernate是一个开源的对象关系映射...

    Hibernate课程资料

    本课程资料旨在提供全面、深入的Hibernate学习资源,帮助初学者快速掌握ORM的核心概念,同时也为有经验的开发者提供复习和深化理解的机会。 一、Hibernate概述 Hibernate是一个强大的持久化框架,它简化了Java应用...

    广州巨匠培训][Hibernate培训课件

    4. `org.hibernate.Query`: 执行各种数据库查询,支持HQL语言和SQL语句。 5. `org.hibernate.Configuration`: 负责配置并启动Hibernate,创建SessionFactory。 **第一个Hibernate例子** 这个例子展示了如何在开发...

    个人信息管理系统Struts2 spring hibernate dwr

    第四次:12小时 第五次:24小时 第六次:3 天 第七次:7 天 之后 :每15天 当然如果没有及时更新复习的话,下一次的复习更新时间会在上一次复习更新后顺延。 在Ajax更新复习次数时通常都会第一次失败,再点一次就...

    个人知识管理系统 Struts2 + Spring + Hibernate

    第四次:12小时 第五次:24小时 第六次:3 天 第七次:7 天 之后 :每15天 当然如果没有及时更新复习的话,下一次的复习更新时间会在上一次复习更新后顺延。 由于对页面样式了解不多,所以写出来的样式目前只在IE...

    考试复习第二部分,框架整合

    "考试复习第二部分,框架整合"这个主题,通常涵盖了多个Java Web开发框架的集成与协作,旨在提高项目开发效率,优化代码结构,并实现更高效的功能复用。在准备这样的考试或者学习过程中,以下是一些重要的知识点: ...

    ssh期末复习题.doc

    SSH 期末复习题涉及到的主要知识点包括 Struts 2 框架、Hibernate ORM 和 Java Web 开发中的核心概念。以下是对这些知识点的详细说明: 1. **Struts 2**: - **基础类库**:构建 Struts 2 应用的基础类库包括 `...

    太原理工大学数据库复习大纲

    此外,还会讲解数据库设计的基本原则,如范式理论,包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和BCNF(Boyce-Codd范式)。 3. **SQL语言**:SQL(结构化查询语言)是用于管理和处理关系数据库的标准...

    Sem5_复习题.zip

    【标题】"Sem5_复习题.zip"是一个包含与信息技术相关的复习材料的压缩文件,它涵盖了JavaScriptFaces(JSF)、Hibernate、Spring框架以及网络服务等多个关键主题。这些内容通常是计算机科学或信息技术专业第五学期...

Global site tag (gtag.js) - Google Analytics