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

hibernate复习第二天

阅读更多


一、id 生成方式
    1,序列sequence 只适用于Oracle,     seqhilo 就不用自己建sequence;默认用数据库里的hibernate_sequence;
        <id name="id" column="id">
                <generator class="seqhilo"> <!--  hibernate_sequence.nextval  -->
               
         <generator class="sequence">
          <param name="sequence">person_seq</param><!--指定sequence名-->
         </generator>
        </id>

    2,自增列,适用于SQLServer和mysql
          mysql建表时加上:id  integer auto_increment primary key,
          SQLServer加上:identity
         
        <id name="id" column="id">
         <generator class="identity"/>
        </id>
   
    3,从表中取最大值加一,DB2和mysql
        <id name="id" column="id" type="integer">
         <generator class="increment"/>
        </id>
       不适合多线程;不多用;
   
    4,根据底层数据库指定生成方法;
   
     <id name="id" column="id">
      <generator class="native"/>
     </id>
     hibernate自己选用哪种生成方式;
            对于Oracle来说还是用的hibernate_sequence ;
            这种比较方便;
           
    5,高低位算法;跟数据库无关的;
   
        <id name="id" column="id">
          <generator class="hilo">
           <param name="table">high_value</param>
           <!--设置高位值取值的表-->
           <param name="column">next_value</param>
           <!--设置高位值取值的字段-->
           <param name="max_lo">50</param>
           <!--指定低位最大值,当取道最大值是会再取一个高位值再运算-->
          </generator>
        </id>
   
     6, uuid 全球唯一的数字,根据时间,ip地址等计算,保证不同;32位16进制;
                  但是是字符串格式的;将id也改成字符串格式即可;将表的字段长度加长,最少32位;
           <generator class="uuid.hex"/>
      
          assigned:自赋值
          select ,foreign ;从别的表取;
 二、基本类型
       Date :java里的类型
       存日期类型时,要指明 type="date" ,  告诉hibernate 用数据库中的哪种类型;
       大多数情况下可以省略type;
 
 三、关联映射:
        关联关系的数量和方向,从面向对象的角度去理解,不要面向数据库去理解;
    1、 一对一:
        java中的一对一,就是互相维护一个引用
     
      1)  唯一外键: 
      
   a. (单向一对一)
        数据库中主外键的关系其实是一对多的关系:
      
        A  pk - fk(b-pk)        n       外键可以多次引用一个主键;
        B  pk                          1 
        要想变成唯一,在外键的表上加上unique约束;
       
        Address 实体类里,有几个属性才在xml文件里配置;
        在Account 里有一个Address的引用,叫关联属性;
        代表了单向的一对一的关系;
       
        <many-to-one  name="addr" column="fid"  unique="true"  cascade="all">
        name是属性的名字;column是字段名;是一个唯一外键,引用另一张表的主键;
                表示一个account对应一个address;不能多个account对应一个address
                数据库里用的是外键,必须用<many-to-one> 标签;
             
                many  ->   account
                one     ->   address     只知道address是一;不知道account是几;需要去address里去读;
                unique=true;//表示我这里是一;不加就表示单向的多对一了;
                到address里去读就是0;因为没有我的引用;
               
                从逻辑上不知道是多对一还是一对一;所以写 标签上写 <many-to-one> ;
                写不写unique=true ; 这就需要从业务来考虑;
                
                 站在PO的角度考虑写什么标签;至于业务上的要求,再加约束;                          
        cascade :级联操作,存本对象时关联存子对象;重点考虑;
                      只存account,便会关联去存address;
        unique=true :表示外键唯一;
       
        create table ln_address(
   oid number(20) primary key,
   postcode varchar2(20),
   city  varchar2(20),
   street  varchar2(30)
        );
        create table ln_account(
         aid number(20) primary key,
         actNo varchar(100) not null,
         owner  varchar(20) not null,
         balance number(20,2),
         fid number(20) not null unique,
         constraint account_address foreign key(fid)
                references  ln_address(oid)
        );
       
                     ?:1    m:1 
        Account : address    ?-----> 1  Address
        <many-to-one>     //在不明确的情况下写这个
        <one-to-one>    //在很明确的情况下写这个,即使很明确的情况下也可以用<many-to-one>

      
    b.  (双向一对一)
         在Address  中加一个  account 属性;
        
         在 Address 中的 setAccount(Account  a){  this.account=a;
                                                                        addr.setAccount(this);
                                                                  }
         不能两边都加;否则死循环;在哪边加都可以,看业务需求;
         
         在Address的配置文件中加上:
         <one-to-one  name="account"  cascade="all">
        
          只能在一边写 <many-to-one> ;并且给外键加上唯一约束;
 
          <many-to-one> 和 <one-to-one> 可以互换;
          那么将外键移到address表里,它的xml文件就是<many-to-one>
          account的xml文件就是<one-to-one> ;
          外键在哪个表里,哪个标签就是<many-to-one>;
         
          这时候存方向的哪一方都会级联存另一方;
          注意:表没有单向和双向的关系;
         
          存 address 时 ,正常存属性 ,读到 <one-to-one> 时,一对一是po之间的关系;
                    知道了是关联属性,到另外一个映射文件中,
                    name=“account” ,找到account所对的类的映射文件;
                    存account 表,表里有一个外键,把address的主键拿过来存进来就行;
                   
                    先存主键的一方,外键才有值;
                    在hibernate.cfg.xml中加上,映射文件写好后;自动产生表:
                    <property name="hbm2ddl.auto">create</property> 
                    每次都是新建表,所以记录都是刚刚插入的记录;
                   
   2)共享主键:这个用的多;POJO类不用变;
    address 的主键又是外键 和 account 的值一致;
  
    account的xml文件:
    <one-to-one  name="address"  cascade="all" >
   
    address 的xml文件:
  
     <id name="oid" column="oid">    既是主键又是外键;值是从它引用的外键得到的;
  <generator class="foreign">   <!--表示主键引用的是别的表 -->
       <param name="property">account</param>
  </generator>
    </id>
   
    <one-to-one name="account"
                      constrained="true" cascade="all"/>
                     
    constrained="true";//acct所对应的类型的表,account表,对我现在的表形成了外键约束;
                                //account表的主键对address表的主键形成了外键约束;
                               
    上边和下边一一对应;是互补的;
 四 、HQL  Query
  1、
    from + 表名; //查询表中的所有对象的集合;
    Query q=s.createQuery("from Account");
    List l=q.list();
    Iterator it=l.iterator();
    while(it.hasNext()) {
     Account acc=(Account)it.next();
     System.out.println(" owner: "+acc.getOwner()+" balance: "+acc.getBalance());
    }
   
  2、  Account acco=(Account)q.uniqueResult();//只有确定只有一个对象时才能用这个;
  3、  条件查询:
       Query q=s.createQuery("from  Account a where a.actNo=?");
       q.setString(1,"10001");
       acco=(Account)q.uniqueResult();//规定帐号唯一;只能返回一条记录;
     
       "from Account a where a.actNo=:actNo"
 q.setString("actNo",xxx);
 或者
 "from Account a where a.actNo=?"
 q.setString(0,xxx);

分享到:
评论

相关推荐

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

    第二次:30分钟, 第三次:4 小时 第四次:12小时 第五次:24小时 第六次:3 天 第七次:7 天 之后 :每15天 当然如果没有及时更新复习的话,下一次的复习更新时间会在上一次复习更新后顺延。 由于对页面样式了解...

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

    第二次:30分钟, 第三次:4 小时 第四次:12小时 第五次:24小时 第六次:3 天 第七次:7 天 之后 :每15天 当然如果没有及时更新复习的话,下一次的复习更新时间会在上一次复习更新后顺延。 在Ajax更新复习次数...

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

    第二次:30分钟, 第三次:4 小时 第四次:12小时 第五次:24小时 第六次:3 天 第七次:7 天 之后 :每15天 当然如果没有及时更新复习的话,下一次的复习更新时间会在上一次复习更新后顺延。 由于对页面样式了解...

    【免费】方立勋JavaWeb[1-11day]源码

    第二天至第四天,可能会深入讲解Servlet的生命周期、请求响应处理机制以及JSP的基本使用。第五天到第七天,可能涵盖JSTL(JavaServer Pages Standard Tag Library)和EL(Expression Language)的使用,这两个工具...

    21天学通JAVA-WEB开发电子教案(PPT)

    【文件名称列表】虽然未提供具体的文件名,但通常这样的教程会包含多个PPT文件,每个文件可能对应课程的不同章节,如"第一天:Java语言基础"、"第二天:Servlet介绍"、"第三天:JSP基本语法"等,逐步深入,逐步引导...

    Java学习路线图.pdf

    第二部分主要关注J2EE(Java 2 Enterprise Edition)框架的学习,总时长27天。首先,学员会花12天学习DRP(Distribution Resource Planning)项目,这涉及到企业级应用的开发。接下来,分别用6天的时间学习Struts、...

    lyk2015:LYK 2015 JAVA SPRING MVC KURS NOTLARI

    第十二天的课程可能会深入到视图解析,Spring MVC如何将模型数据转换为视图。这可能包括对视图解析器(ViewResolver)的讨论,以及如何使用JSP、Thymeleaf等模板引擎来呈现用户界面。同时,模型-视图-模型...

    java学习资料总结2015新

    - **《21天学通JavaScript(第2版)》** 和 **《JavaScript动态网页开发案例指导》** 则通过丰富的案例帮助读者快速掌握 JavaScript 的核心概念和技术。 通过以上资源的学习,无论是初学者还是有一定经验的开发者,...

Global site tag (gtag.js) - Google Analytics