`
凯旋人生
  • 浏览: 63263 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

hibernate应用笔记

阅读更多

mySql数据库的隔离级别

Mysql:

查询隔离级别:  select @@tx_isolation;     REPEATABLE-READ  (可重复读)

 

更改隔离级别:  set transaction isolation level read uncommitted;(未提交读, 没commit也能读到)

 

 

 

cascade="all"   级联操作

inverse="true"  控制反转

 

◆继承映射

1)父、子类在一个表中:

 

<class name="Animal" package="extendsMapping" table="t_animal">

   <id name="id">

     <generator class="native"/>

   </id>

  <!--鉴别器要紧挨着放到id下面这个string是hibernate类型,也可以-->

  <discriminator column="type" type="string"/>用java类型  

   <property name="name"/>

   <property name="sex"/>

   <subclass name="Pig" discriminator-value="P">

       <property name="weight"/>

   </subclass>

   <subclass name="Bird" discriminator-value="B">

       <property name="height">

   </subclass>

</class>

 

2)每个父、子类在一个表中:

<class name="Animal" package="extendsMapping" table="t_animal">

   <id name="id">

     <generator class="native"/>

   </id>

   <property name="name"/>

   <property name="sex"/>

    <joined-subclass name="Pig">

      <key column="pid"/>

      <property name ="weight"/>

   </joined-subclass>

   <joined-subclass name="Bird">

     <key column="bid"/>

      <property name="height"/>

  </joined-subclass>

</class>

 

3)父类无表(有,设成抽象也不导出的),每个子类都对应一张表:(子类间id不能从)

<class name="Animal" package="extendsMapping" table="t_animal" abstract="true">

   <id name="id">

     <generator class="assigned "/><!--主键不能重复需要手动分配-->

   </id>

   <property name="name"/>

   <property name="sex"/>

   <union-subclass name="Pig" tabble="t_pig">

         <property name="weight"/>

  </union-subclass>

 

<union-subclass name="Bird" tabble="t_birg">

         <property name="height"/>

  </union-subclass>

</class>

 

◆component 映射 :

       在hibernate中,component是实体对象的逻辑组成部分,component与实体对象的本质区别是它没有oid,

 

       component的好处,它实现了对象的层次细粒度划分,层次分明,利于复用

 

   <hibernate-mapping>

      <class name="mapping.User">

           <id name="id">

              <generator class="native"/>

           </id>

           <property name="name">

            <component name="contact">

                    <property name="contactTel"/>

                    <property name="email"/>

                    <property name="zipCode"/>                        

                    <property name="address"/>

            </component>

   </hibernate-mapping>

 

◆复合主键(联合主键)映射

通常将复合主键相关的属性,放到单独的实体类中

    该实体类

            ● 必须实现序列化接口 implements Serializable

            ● 必须重写equals和hashcode方法

<hibernate-mapping>

    <class name="ormapping.FiscalYearPeriod" table="t_fiscal_year_period">

       <composite-id name="fiscalYearPeriodPK">

             <key-property name="fiscalYear"/>

             <key-property name="fiscalPeriod"/>

       </composite-id>

       <property name="beginDate"/>

       <property name="endDate"/>

       <property name="periodSts"/>

      </class>

</hiberante-mapping>

 

◆集合映射映射

         ●set

         ●list

         ●array

         ●map

 

<hibernate-mapping>

   <class name="ormapping.CollectionMapping">

     <id name="id">

          <generator class="native"/>

     </id>

     <property name="name"/>

      

      <set name="setValues" table="t_setvalues">

         <key column="setid"/>

          <element type="string" column="value"></element>

       </set>

 

      <list name="listValues" table="t_listvalues">

         <key cloumn="lid"/>

         <list-index column="list_index"/><!--维护list的顺序-->

         <element type="string" column="value"/>

      </list>

 

     <array name="arrayValues" table="t_arrayvalues">

         <key column="arrayid"/>

         <list-index column="array_index"/>

          <element type="string" column="value"/>

          <!--如果不是普通属性用<composite-element>-->

     </array>

 

      <map name="mapValues" table="t_mapvalues">

           <key column="mapid">

           <map-key type="string" column="key"/>

           <element type="string"  column="value"/>

      </map>

   </class>

</hibernate-mapping>

 

◆树的映射,

     节点-父节点  many-to-one, 节点-子节点  one-to-many

   <hibernate-mapping>

      <class name="ormapping.Node" table="t_node">

          <id name="id">

                <generator class="native"/>

          </id>

           <porperty name="name"/>

           <property name="levle"/>

           <property name="leaf"/>

             <!--<many-to--one>在多的一段加个外键指向一的一端,这个例子中就一个表,加的外键指向本表,即自关联-->

           <many-to-one name="parent" column="pid"/>

           <set name="children" lazy="extra" inverse ="true">

                  <key column="pid"/>

                   <one-to-many class="ORMapping.Node" >

           </set>

 

      </class>

   </hibernate-mapping>

 

 

hibernate中的锁

悲观锁:其实现一般依赖于数据库提供的机制,在整个处理过程中数据将处于锁定状态

 

例如: select * from user for update

        select * from user for update nowait(oracle用)

 

hibernate中用  load(Class theClass,Serializable id,LockMode lockMode),

lockMode: UPGRADE(ORACLE用 UPGRADE_NOWAIT)

 

乐观锁:大多数是基于数据版本记录机制实现(version),一般在数据库中加一个version字段

         读取数据时连同版本号一同读出,之后更新是版本号加一,如果提交数据小于当前版本

         号则认为数据是过期的否则才能更新。(也有用时间戳实现的。)

<hibernate-mapping>

   <class name="ormapping.user" optimistic-lock="version" ><!--不写也可以默认就是version-->

          <id name="id">

                <generator class="uuid"/>

          </id>

          <version name="version"/>

           <property name="name"/>

              ...

   </class>

</hibernate-mappin>

 

 

 

 

 

 

hibernate的 lazy(延迟加载):

lazy的策略可以用在:

   ● <class>标签上,可以去值:true/false

   ● <property>标签上,可以取:true/false,这个属性需要类增强工具

   ● <set><list>等集合上,可以去值:true/false/extra

   ● <one-to-one>和<many-to-one>(单端关联)等标签上,可以取:false/proxy/noproxy

 

概念:

   ● lazy是只有需要的时候才发出sql语句

   ● hibernate支持lazy策略,只有session打开状态才有效可以用 ThreadLocale和Filter->OpenSessionInView来解  决。

    hibernate在class级别的lazy可以控制什么时候加载这些普通属性(property),但不能控制many-to-one one-to-many等。

 

 

 hibernate在集合上的lazy策略,可以取值ture/false/extra (智能推荐)

 

 hibernate在单端关联的lazy策略<one-to-one>和<many-to-one>,可以取值: false/proxy/noproxy(noproxy需要类增强工具)

 

 

HQL查询

简单属性查询

 

 ●单个属性查询,返回结果集为单个属性的集合。

   List students= session.createQuery("select name from Student").list();

   //students 为name对应的类型String集合List<String>

    for(Iterator iter=students.iterator();iter.hasNext()){

       String  name =(String)iter.next();

    }

 

 ●多个属性查询,返回结果为对象数组的集合,对象数组的长度取决于查询属性的个数,类型取决于属性类型

   List students = session.createQuery("select id,name from Student").list();

 

     for(Iterator iter=students.iterator();iter.hasNext()){

         Object[] objs=(Object[])iter.next();

    }

 

 ●多个属性查询,用hql动态实例化对象返回

   List students = session.createQuery("select new Strudent (id,name) from Student").list();

 

     for(Iterator iter=students.iterator();iter.hasNext()){

       Student student = iter.next();

    }

 

 ●别名

   List students = session.createQuery("select s.id, s.name from Student s").list();

   或

   List students = session.createQuery("select s.id, s.name from Student as s").list();

 

查询实体对象

 

●查询实体对象 可以忽略select,但如果用select了必须使用别名,hql不支持*,支持count(*)

   List students = session.createQuery("from Student").list();

 //List students = session.createQuery("select s from Student as s").list();

    for(Iterator iter=students.iterator();iter.hasNext()){

       Student student = iter.next();

    }

   ●)n+1问题,在默认情况下使用query .iterate()查询,可能会引发n+1问题,所为n+1是指在查询

   对象的时候发出了n+1条查询语句

   1:首先发出查询实体对象id列表的sql

   n:根据id在缓存中查询,如果缓存中有与之匹配的数据,那么就区缓存中的数据,否则依次根据id发出查询语句。

 

   ●)query.list()默认只往缓存中放不从缓存中读。

     发出 select student0_.id as id1_,student0_.name as name1,.... from t_student as   student0_

    query.iterate(),会利用缓存读取查询,第一次查询 会发出n+1条select语句,1为先查id的sql语句,然后根据id 查

     n为记录的总数,如果第2回就不会了....

  select student0_.id as col_0_0_ from t_student as student0_

 

  select student0_.id as col_0_0_,student0_.name as name1,.... from t_student as student0_ where student0_.id = ?

 

3 条件查询

  可以拼HQL串,

    List students = session.createQuery("select s.id ,s.name from Student s where s.name like '%1%'").list();

  方法链编程,传递参数不需要''号

    ●采用?传递参数

   List students = session.createQuery("select s.id ,s.name from Student s where s.name like ? ").setParameter(0,"%1% ").list();

     ●采用 :参数名传递

   List students = session.createQuery("select s.id ,s.name from Student s where s.name like : myname

").setParameter("myname","%1%").list();

 

    ● 条件查询支持in ,通常用setParameterList来赋值

   List students = session.createQuery("select s.id ,s.name from Student s where s.id in (:myids) ")

           .setParameterList("myname",new Objects[]{1,3,5}).list();

    ●between

   List students = session.createQuery("select s.id ,s.name from Student s where s.createTime

between ? and ? order by s.id ").setParameterList(0,mydateformat.parse("2008/08/01")).setParameterList(1,dateformat.parse("2008/08/25")).list();

   ●调用数据库的函数

   List students = session.createQuery("select s.id ,s.name from Student s where date_format(s.createTime,'%Y-%m')=? order by s.id ")。setParameterList(1,"2008/08/25").list();

 

4 外置命名查询

   ● 在映射文件中采用<query>类定义hql

<hibernate-mapping>

  <class name=...>

  ...

  </class>

  <query><![CDTA[

             select s from Student s where s.di <?

  ]]>

  </query>

</hibernate-mapping>

   ●在程序中使用session.getNamedQuery()方法来得到查询(query对象)


5 查询过滤器

   ●定义过滤器参数

   ●在类映射文件中使用过滤参数

   ●在程序中启用过滤器

<hibernate-mapping>

  <class name=...>

  ...

  <!--在类映射文件中使用过滤参数-->

 <filter name="filtertest" condition="id &lt; :myid " />

  </class>

 

     <!--定义过滤器参数-->

    <filter-def name="filtertest">

         <filter-param name="myid" type="integer">

    </filter-def>

<hiberante-mappingapping>

 

 //在程序中启用过滤器,并设置参数

 session.enableFileter("filtertest").setParameter("myid",10);

 

6.hibernate3开始支持原生sql查询

  //返回结果是对象数组的集合,顺序同数据库中表的顺序

   session.createSqlQuery("select * from t_student").list();

     for(Iterator iter=students.iterator();iter.hasNext()){

         Object[] objs=(Object[])iter.next();

    }

 

7分页查询

   session.createQuery("from student").setFirstResult(0).setMaxResults(2).list();

 

8 对象导航查询 在hql中,使用.进行导航

   session.createQuery("select s from student s where s.classes.id <5")

 

9 连接查询

   ●内连接

     session.createQuery("select c.name, s.name from Student s join s.classes c").list();

   ●外连接(左连接/右连接)

     左连接 把所有班级都显示出来

     session.createQuery("select c.name, s.name from Classes c left join c.students s").list();

     右连接 把所有学生都显示出来

      session.createQuery("select c.name, s.name from Classes c right join c.students s").list();

 

10.统计查询

     List students=session.createQuery("select count(*) from Student").list();

     Long count = (Long)students.get(0);

 

     Long count=session.createQuery("select count(*) from Student").uniqueResult();

 

     session.createQuery("select c.name,count(s) from Student s join s.class c

     group by c.name order by c.id").uniqueResult();

 

 

hibernate的一级缓存

  一级缓存的生命周期和session一致,随着session的关闭而销亡。

    ●get/load/iterate(查询实体对象)使用一级缓存

  一级缓存缓存的是实体对象。   

  如何管理一级缓存

    ●session.clear/session.evict

 

  如何避免一次性大批量的实体数据插入

    ●先flush,在clear清除缓存

 

hibernate的二级缓存

   二级缓存也是缓存实体类

   二级缓存也称进程级缓存或叫SessionFactory级缓存,它可以被所有session共享

   二级缓存的生命周期伴随SessionFactory的生命周期存在和销往

   SessionFactory可以管理二级缓存

   二级缓存的配置和使用:

      ●将ehcache.xml文件拷贝到src下

      ●在hibernate.cfg.xml中配置启用二级缓存,默认就是开启

 

     <hibernate-configuration>

         <session-factory>

                    ...

          <!--是否启用二级缓存-->

          <property name="hibernate.cache.use_second_level_cache">true</property>

          <!--指定使用的二级缓存产品-->

          <property name="hibernate.cache.EhCacheProvider_class"

         </session-factory>

     </hibernate-configuration>

    ●指定哪些实体类使用二级缓存

     1)可以在hibernate.xml配置文件中定义

     <class-cache class="xxx" usage="read-only"/>

     2)可以在映射文件中配置缓存策略

      <hibernate-mapping>

         <class name="xxx">

           <cache usage="read-only"/>

         </class>

      </hibernate-mapping>

 

    ●一二级缓存的交互,通过setCacheMode(Cache.Mode.GET)(PUT)默认读写

hibernate的查询缓存

    查询缓存是针对普通属结果集的缓存

    对实体对象的结果集只缓存主键id.

 

    查询缓存的生命周期,当查询关联的表发生修改,那么查询缓存的生命周期结束。

 

    查询缓存的配置和使用:()

           在hibernate.cfg.xml文件中加入

           <property name="hibernate.cache.use_query_cache">true</property>

 

           在程序中显式开启查询缓存

           query.setCacheable(true);            

 

说明:转义字符应以“&”开头,以“;”结尾。

HTML常用转义字符:

字符

转义字符

描述

&

&amp;

<

&lt;

小于号

>

&gt;

大于号

"

&quot;

双引号

 

&nbsp;

空格

©

&copy;

版权符

®

&reg;

注册符

XML常用转义字符:

字符

转义字符

描述

&

&amp;

<

&lt;

小于号

>

&gt;

大于号

"

&quot;

双引号

'

&apos;

单引号

评论

相关推荐

    Hibernate学习笔记整理

    Hibernate学习笔记整理 以下是 Hibernate 框架的详细知识点: Hibernate 介绍 Hibernate 是一个 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到数据库表中。它提供了一个简洁的方式来访问和操作...

    Hibernate学习笔记特别详细

    创建一个简单的Hibernate应用通常涉及以下步骤:配置Hibernate环境(包括hibernate.cfg.xml文件),创建实体类,编写映射文件,以及编写Session工厂和Session的代码。一个基本的增删查改操作可以展示其简洁的API使用...

    Java相关课程系列笔记之十四Hibernate学习笔记

    【Java相关课程系列笔记之十四Hibernate学习笔记】 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。本笔记将详细阐述Hibernate的核心概念、使用方法和特性。 一、...

    马士兵hibernate学习笔记(原版)

    3. **Hibernate基础配置**:配置文件`hibernate.cfg.xml`是Hibernate应用的基础,包含了数据库连接信息、方言设置、缓存配置等内容。其中,ID生成策略(如.AUTO)用于指定主键如何自动生成,是配置中的重要部分。 4...

    Hibernate,hibernate笔记

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式来操作数据库。这个框架将数据库操作转化为对Java对象的操作,...通过上述步骤,你可以更好地了解和应用Hibernate进行数据库操作。

    Hibernate映射笔记

    ### Hibernate映射笔记详解 #### Hibernate映射文件与配置关系 Hibernate映射是ORM(对象关系映射)框架中的一项关键技术,它允许开发者在数据库表和Java对象之间建立映射关系,从而简化了数据访问层的开发工作。...

    hibernate第一天笔记

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

    hibernate笔记.txt

    在深入探讨《hibernate笔记.txt》所提及的关键知识点前,我们先来解析一下标题和描述中的核心概念。“自上而下的依赖,单向依赖,层与层之间最好依赖抽象”,这一描述实际上触及了软件架构设计中的关键原则,特别是...

    Hibernate实战笔记

    ### Hibernate实战笔记——深入解析对象关系映射与优化策略 #### 一、对象关系映射(ORM)概念 - **什么是持久化**:在计算机科学领域,“持久化”指的是将程序的数据状态保存到非易失性的存储介质中,以便可以在...

    hibernate学习笔记mashibing

    在BBS2007这样的应用中,我们可以看到如何将Hibernate的查询能力融入到实际业务逻辑中,提高开发效率。 性能优化是任何系统都不能忽视的一环。Hibernate提供了缓存机制、批处理、延迟加载等优化手段,通过合理配置...

    马士兵java框架hibernate学习笔记

    ### 马士兵Java框架Hibernate学习笔记 #### 一、HelloWorld - **知识点概述**: - **项目搭建**:介绍了如何从零开始搭建一个简单的Hibernate项目。 - **环境配置**:包括了如何配置MySQL数据库、创建必要的表...

    传智播客 hibernate笔记(word+pdf+源码)

    【传智播客 Hibernate 笔记】是一份深入学习 Hibernate ORM 框架的资源集合,包括了 word 笔记、pdf 讲义、源代码以及相关分析图表和 jar 包,旨在帮助开发者全面理解并掌握 Hibernate 的核心概念与实际应用。...

    hibernate学习笔记文档

    ### Hibernate 学习笔记知识点概览 #### 一、Hibernate 概述 - **定义**:Hibernate 是一款开源的对象关系映射(ORM)框架,它实现了将 Java 应用程序中的对象模型映射到关系型数据库中的记录。通过 ORM 技术,...

    韩顺平hibernate笔记

    这份笔记涵盖了从基础到高级的Hibernate应用,包括配置、实体管理、查询语言、缓存策略等多个方面,旨在帮助读者深入理解和熟练运用Hibernate。 首先,笔记可能从Hibernate的核心概念开始介绍,如Entity(实体)、...

    韩顺平.2011版.hibernate笔记.zip

    9. 性能优化:最后,笔记会探讨一些Hibernate的性能优化技巧,如批处理、缓存策略、延迟加载的合理使用等,以提高应用程序的运行效率。 总之,《韩顺平.2011版.hibernate笔记》全面地介绍了Hibernate的各个方面,...

    Hibernate全部笔记

    **Hibernate 全部笔记** Hibernate 是一款开源的Java平台上的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式来处理数据库事务。本笔记将深入探讨Hibernate的核心概念、...

Global site tag (gtag.js) - Google Analytics