`
hao861002
  • 浏览: 86483 次
  • 性别: 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);

分享到:
评论

相关推荐

    hibernate培训第二天

    【hibernate培训第二天】——深入理解Hibernate框架 在软件开发中,ORM(Object-Relational Mapping)框架已经成为连接数据库与应用程序的重要桥梁,而Hibernate作为Java领域中的主流ORM框架,其强大而灵活的功能...

    hibernate学习笔记第二天的源码

    在深入探讨Hibernate学习笔记第二天的源码之前,我们先来理解一下Hibernate的核心概念。Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作转化为对象模型,大大简化了数据访问层的开发...

    hibernate+spring复习大纲

    **hibernate+spring复习大纲** 在Java Web开发领域,Hibernate和Spring是两个至关重要的框架。Hibernate是一个对象关系映射(ORM)框架,它简化了数据库操作,而Spring则是一个全面的企业级应用框架,提供了依赖...

    学习hibernate第二天

    标题“学习hibernate第二天”表明我们正在探讨的是关于Hibernate框架的初步学习过程,特别是第二天的学习内容,这通常涉及到更深入的理论和技术细节。Hibernate是一个Java语言中的对象关系映射(ORM)框架,它允许...

    hibernate达内五天复习笔记.pdf

    《Hibernate达内五天复习笔记》是一份详细记录了Hibernate框架学习的资料,旨在帮助读者深入理解并掌握Hibernate这一强大的Java持久化框架。以下是笔记中的主要知识点: 1. **ORM原理**: - **对象持久化**:将...

    孙卫琴hibernate实战第二版书及源码.part1

    孙卫琴hibernate实战第二版书及源码

    孙卫琴hibernate实战第二版书及源码.part2.

    hibernate

    Hibernate实战第二版

    《图灵程序设计丛书·Hibernate实战(第2版)》是毋庸置疑的Hibernate和ORM(对象/关系映射)权威著作,由包括Hibernate之父在内的两位核心开发人员亲自执笔,详细讲述了Hibernate 3.2、Java Persistence和EJB 3.0标准...

    hibernate实战第二版.pdf

    《Hibernate实战》第二版是一本深入探讨Java领域中ORM(对象关系映射)技术的经典教程。Hibernate作为Java EE开发中的重要框架,它有效地解决了数据库与Java对象之间的转换问题,简化了数据操作。这本书针对初学者和...

    hibernate第一天笔记

    《Hibernate入门:第一天笔记详解》 Hibernate,作为Java领域中著名的ORM(Object-Relational Mapping)框架,极大地简化了数据库操作,让开发者可以更加专注于业务逻辑而不是底层的数据访问。本文将基于第一天学习...

    hibernate实战 英文版

    #### 二、书籍内容概述 本书不仅是一本教程和参考指南,还深入介绍了如何开发和优化工业级别的Hibernate应用程序。作者们按照从简单到复杂的顺序逐步介绍概念,并通过丰富的实例来解释每一个细节。以下是本书覆盖的...

    hibernate知识复习二:组合映射

    【标题】:“Hibernate知识复习二:组合映射” 在Java Web开发中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作,将数据库中的表映射为Java对象,使得开发者可以像操作普通对象一样操作...

    精通Hibernate:Java持久化对象技术详解[第二版]

    《精通Hibernate:Java持久化对象技术详解[第二版]》是一部深入探讨Hibernate框架的专业书籍,旨在帮助Java开发者熟练掌握和运用这一强大的ORM(Object-Relational Mapping)工具。Hibernate是Java开发领域中广泛...

    Manning.Java.Persistence.with.Hibernate[Hibernate实战第二版].pdf

    这本书的第二版由Hibernate的创始人Gavin King亲自撰写,针对Hibernate 3进行了全面的更新,以适应当时最新的技术和最佳实践。 Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者以面向对象的方式...

    深入浅出Hibernate(PDF)第二部分

    本书由互联网上影响广泛的开放文档OpenDoc系列自由文献首份文档“Hibernate开发...深入浅出hibernate(PDF)第二部分,深入浅出hibernate(PDF)第三部分全部下载,并解压到一个地方才可以正常解压阅读.给大家带来不便望谅解.

    Hibernate实战 第二版 中文版 part1

    Hibernate实战 第二版 中文版 Hibernate实战 第二版 中文版

    hibernate实战第二版

    《Hibernate实战第二版》这本书是Hibernate创始人Gavin King亲自撰写的一部权威指南,它深入浅出地探讨了Hibernate这一强大的对象关系映射(ORM)框架。对于任何希望掌握Java编程并利用ORM技术来简化数据库操作的...

    hibernate实战 第2版.pdf

    但是,考虑到标题和描述中提到的“hibernate实战 第2版.pdf”,我们可以基于这个信息来生成关于Hibernate的知识点。以下是根据这一主题撰写的详细知识点: Hibernate是一个开放源代码的对象关系映射(ORM)框架,...

    Hibernate二级缓存

    Hibernate二级缓存是一种提高应用程序性能的技术,它将数据存储在SessionFactory级别的缓存中,使得数据可以在不同的Session之间共享。这与一级缓存(Session级别)不同,一级缓存仅存在于单个Session生命周期内,当...

Global site tag (gtag.js) - Google Analytics