Hibernate核心:ORM(对象关系映射)

BeginSession关闭的时候要session.close(),getCurrentsession不需要,它会自动关闭

Session.load(.Class,id)方法和session.get(.Class,id)方法

三种状态:

瞬时态:刚用new创建出来,还没有用到,存在于session缓存中

持久态:将数据存入到了(比如:数据库中,硬盘中),数据永久存在,并被session管理

脱管态:存在于数据库中,但没有被session管理

快照区: 临时存储持久化对象的副本。

在快照区中通过session.flush()强制刷新,将数据传到数据库中

Hibernate相关文件的配置:

  1. 1.     hibernate.cfg.xml:包含hibernate和数据库的基本连接信息

2.XXX.hbm.xml映射文件配置

双向一对多配置:以一的一方作为对象把多的一方的对象存进来

两个类:区域类(一)和街道类(多)

区域:

街道类:

文件配置:

通用头文件:

区域配置:

街道配置:

测试类:

    单项多对一配置:多的一方中当做对象存进一的一方的对象

区域类(一):

街道类(多):

区域配置:

街道配置:

测试类:

多对多配置:互相添加

老师类和学生类,在多对多中要借用中间表

数据库设计:

老师:teacher

   

学生:student

   

中间表:teacher_student

   

老师类:

学生类

老师配置:

学生配置:

测试类:

 双向一对一配置:相互添加

用户类:

身份证类:

主键关联即其中一个表的主键参照另外一张表的主键而建立起一对一关联关系的配置:

用户配置:

身份证配置:

测试类:

外键关联:<many-to-one>元素中设置属性unique=”true”就变成了一对一

Cascade级联

       All:所有操作进行级联删除

       Save-update:执行保存和更改的操作时进行级联

       Delete:执行删除操作进行级联

       None:对所有操作不进行级联

Inverse:控制反转(是否维护关联关系或者说是是否把权力交给另一方)

              True:是(放弃),由被动方来维护关联关系,比如:主动方要进行删除操作,被动方就不会跟着进行删除操作

              False:否,由主动方来维护关联关系,比如:主动方要进行删除操作,被动方就会跟着进行删除操作

 

查询:

HQL查询:注意,查询中查询的不是数据库表名,而是pojo的类名

  1.      单一属性查询,返回String类型

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

  1.     多个属性查询,返回数据对象类型,对象数组的长度取决于属性的个数

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

  1.      实体对象查询,返回对象

session.createQuery("from Student").list();

几种参数:

1)“?”占位符参数,注意下标从0开始

2)“:name”命名参数

命名查询:在任何一个映射文件中加入都行,最好是在要查询的这一端配置

<hibernate-mapping>

    <class name="com.msit.houserent.bean.User" table="users">

        <!--省略其他配置-->

    </class>

    <query name="loginUser">

        <![CDATA[

            from User u where u.name =:name and u.password =:password

        ]]>

    </query>

</hibernate-mapping>

注意:是在<class>标签外,name是名字,随意取名,查询的时候就直接通过sesison.getNameQuery(name)方法进行查询

本地sql查询(最原始的sql语句查询):session.createSQLQuery()方法返回SQLQuery对象

  • 通过命名查询实现本地SQL查询

    • 使用<sql-query>元素定义本地SQL 查询语句
    • <class>元素并列
    • <![CDATA[SQL]]>方式保存SQL 语句通过Session 对象的getNamedQuery()方法获取该查询语句

Criteria查询(对象查询):

  1.      查询方式:session.createCriteria(.Class).list()
  2.     普通条件查询:Criteria.add(Restrictions.方法())

几种模糊查询:

  1.     排序查询:Criteria.addOrder(Order.方法())
  2.      统计查询:Criteria.setProjection(Projections.方法())
  3.     分组查询:Criteria.setProjection(Projections.groupPerporty())
  4.      结合统计和分组查询:

ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.groupProperty("age"));
·
projectionList.add(Projections.rowCount());

Criteria.setProjection(projectionList);

  1.      针对实体类查询:Criteria.add(Example.create(对象))

在查询的时候对对象的属性进行赋值,查询出来的结果就是符合这些属性的结果

工具javaBean是专门用于操作的一个Bean类,通过setProperties(Object Bean)

  1.      当需要查询多个属性时,我们可以封装出一个专门用于操作的Bean来,类似于对象查询中的Example查询

就是从表单传入值时,把值放置Bean中,这样有些属性有值,有些属性没值,然后调用setProperties()方法进行查询,根据有的属性进行查询(符合这些属性的),将查询结果返回。这样根据不同个数的属性,查询出来的结果也就不一样

  1.      Dao层中这样使用。

List查询和iterator查询的区别:

  1.      list查询返回的是一条sql语句
  2.      iterator返回的是n+1条语句,1是指查出来的idn是指根据id查出来的结果
  3.      从缓存机制中看:

getload的区别:

  1.      get是立即加载  
  2.      load是延迟加载,先根据id把查出来的结果放在内存中,当想要调用哪个查询结果时,就从缓存中调出来

openSessiongetCurrentsession的区别:

  1.      getCurrentsession是获取上下文的一个对象,并且连续使用多次,获得的都是同一个对象,会自动执行session.close()方法

2.openSession是连续使用多次,获得的都不是同一个对象,要显示调用session.close()

Hibernate的优化:

  1.      对数据库的设计:一般在数据表中空留出5个空字段,当发现需要再添加某个字段的时候,就能在这5个空字段中增加
  2.      HQL的优化:避免包含or(可以用in代替),not(可以用比较运算符代替),likehavingdistinct关键字
  3.      配置参数:
  4.     方法使用:
  5.      缓存管理:

 

缓存机制:

一级缓存:针对对象查询

  1.      在同一个session中发出两次loadget)查询,第二次不会再发出查询语句,load使用缓存
  2.      在同一个session中发出两次iterator查询普通属性,会再次发出查询语句,因为一级缓存不会缓存属性
  3.      在两个session中法load查询,会再次发出查询语句session之间不能共享一级缓存
  4.      在同一个session中先调用save,在调用load查询刚刚save的数据,不会再次发出查询语句,因为save支持缓存
  5.      当有大批量数据时,我们可以指定在多少条数据的时候进行强制刷新(flush)到数据库中

二级缓存:针对对象查询

二级缓存的配置:

*添加架包ehcache-1.2.3.jar和commons-logging-1.1.1.jar

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

*在hibernate.cfg.xml中配置:

  1. 开启二级缓存,在两个session中法load(get)查询,返回一条sql语句,因为二级缓存可共享
  2. 在二级缓存中调用evict()方法:

  此方法写在两个session中间,不是开头处

3.禁止将一级缓存中的数据放到二级缓存中

此方法放在第一个session开头处

查询缓存:针对查询出来的结果进行缓存

查询缓存的配置:

       hibernate.cfg.xml中配置:

1.开启查询缓存,关闭二级缓存,用list()方法查询普通属性,在两个session中将只返回一条sql语句,因为查询缓存可以针对属性

2. 开启查询缓存,关闭二级缓存,用iterator()方法查询普通属性,在两个session中发iterator查询,将返回2sql语句,因为查询缓存只对list()方法有效果

3.开启查询缓存,关闭二级缓存,用list()方法查询实体,在两个session中查询,会发出n条语句,查询缓存会缓存实体对象的id,第二次执行将查询缓存中id依次取出来,分别到一级和二级缓存中去查询相对应的实体对象,如果存在就使用缓存中的实体对象,否则就根据id发出查询语句

4.开启查询缓存,开启二级缓存,list()方法在两个session中,第二次执行不会再发出sql句,因为开启了二级缓存

锁机制:

  1.     悲观锁:在load(get)查询中的第三个参数设置成lockmode.force,注意:使用悲观锁时,每个load都要加入此参数。含义:当第一个在执行此操作的时候,第二个操作者必须等第一个操作者执行完才执行
  2.    乐观锁

配置:在数据表中加入version这一字段,然后在Bean中也加上,最后在映射文件中加入<version name=””>这一个。含义:当第一个操作者在操作时,第二个操作者也可以操作,就看谁先完成,谁就成功,当成功后,另一个操作者就会报异常

各个jar包的含义:

1.antlr-2.7.6.jar的作用

项目中如果没有添加antlr-2.7.6.jar,那么相关的hibernate映射不会执行hql语句

并且会报NoClassDefFoundError:antlr/ANTLRException错误。

  1.      hibernate3.jarHibernate的核心库
  2.      dom4j.jar: dom4j是一个JavaXML API,类似于jdom,用来读写XML文件的。
  3.      commons-collections.jar:包含了一些Apache开发的集合类,功能比java.util.*强大
  4.     jta.jarJTA规范,当Hibernate使用JTA的时候需要,不过App Server都会带上, 标准的 JAVA 事务处理接口 
  5.     ehcache-1.1.jar :缓存工具,用于hibernate二级缓存中的.

      6.Javassist.jar: 动态编译,动态生成二进制字节码(.class)动态创建新类或新接口的二进制字节码,   动态扩展现有类或接口的二进制字节码             7.ojdbc14.jar:用于连接oracle数据库的jar

    8.  commons-logging-1.0.4.jar Apache 软件基我组所提供的日志工具

问题

1.no-session问题;

       解决方法一:在映射文件中,将要调用的那一方的lazy属性设为false

       解决方法二:在读取想要调用的属性时,可以先拿出来

2.在多对一中如何获取一这边的值:

如果用的是el表达式的话:

多:private
Users users;

一:private
Set<House> houses;

    private
String telephone;

 

那么可通过${session.users.telephone;}

注意:在dao层获得值的时候必须

List<House> hList = session.createQuery("from
House
h").setFirstResult((currentpage-1)*pageSize).setMaxResults(currentpage*pageSize).list();

for(House house : hList){

   String
telephone=house.getUsers().getTelephone();

   
houses.add(house);

}

必须重新写telephone,否侧会报:

Error reading 'telephone' on type
com.Hibernate.Bean.Users_$$_javassist_1
错误

 

 

注意2

在查询语句中,在多对一的情况下,想根据一的一方的属性去查询多的一方的值,可以直接用对象.属性来查询

如:

多:House

  private Street
street;

一:Street

  Private int
id;

from House where street.id=?

  1. 3.     insert
    fail: filed depid doesnot have default value:depid
    为空
  2. 4.     myeclipse中没有报错,但是就是数据库中楞写不进去数据,这是原因呢?

原因一:你忘记把映射文件加入到hibernate.cfg.xml文件中了

原因二:映射文件配置错了

hibernate的学习周的更多相关文章

  1. 稍稍乱入的CNN,本文依然是学习周莫烦视频的笔记。

    稍稍乱入的CNN,本文依然是学习周莫烦视频的笔记. 还有 google 在 udacity 上的 CNN 教程. CNN(Convolutional Neural Networks) 卷积神经网络简单 ...

  2. Hibernate进阶学习4

    Hibernate进阶学习4 深入学习hibernate的查询语句 测试HQL查询 package com.hibernate.test; import com.hibernate.domain.Cu ...

  3. Hibernate进阶学习3

    Hibernate进阶学习3 测试hibernate的多表关联操作(一对多,多对一,多对多) 表之间的关系主要在类与元数据配置文件中体现 package com.hibernate.domain; i ...

  4. Hibernate基础学习2

    Hibernate基础学习2 测试hibernate的一级缓存,事务以及查询语句 1)Hibernate的一些相关概念 hibernate的一级缓存 1)缓存是为了提高该框架对数据库的查询速度 2)一 ...

  5. Hibernate 系列 学习笔记 目录 (持续更新...)

    前言: 最近也在学习Hibernate,遇到的问题差不多都解决了,顺便把学习过程遇到的问题和查找的资料文档都整理了一下分享出来,也算是能帮助更多的朋友们了. 最开始使用的是经典的MyEclipse,后 ...

  6. Hibernate入门学习-安装hibernate插件

    最近一直在学习ssh框架,为了更方便hibernate的使用,所以在eclipse下载hibernate插件,安装插件有两种方法 第一种:本地安装 1).插件的官网下载地址:http://tools. ...

  7. cache数据库学习周结

    学习cache数据库只有两周,下面说一下对这一数据库的理解吧.不一定对 cache数据库最大的特点是global: global就像全区变量一样,是一个广义的全局变量.数据库表中的一些重要的字段名以字 ...

  8. Hibernate基础学习(三)—Session

    一.概述      Session接口是Hibernate向应用程序提供的操纵数据库最主要的接口,它提供了基本的保存.更新.删除和加载Java对象的方法.      Session具有一个缓存,位于缓 ...

  9. Hibernate框架学习之注解映射实体类

         前面的相关文章中,我们已经介绍了使用XML配置文件映射实体类及其各种类型的属性的相关知识.然而不论是时代的潮流还是臃肿繁杂的配置代码告诉我们,注解配置才是更人性化的设计,于是学习了基本的映射 ...

随机推荐

  1. js写插件教程入门

    原文地址:https://github.com/lianxiaozhuang/blog 转载请注明出处   1. 点击add可以添加个自input的内容到div里并实现变颜色 <div id=& ...

  2. codeforces611C

    New Year and Domino CodeForces - 611C 他们说:“每一年都像多米诺骨牌,一个接一个地倒下去”.但是,一年能够像多米诺骨牌那样放在网格中吗?我不这么认为. Zydsg ...

  3. 删除本地git的远程分支和远程删除git服务器的分支【转】

    转- 删除本地git的远程分支和远程删除git服务器的分支 在项目中使用git管理代码后,有些时候会创建很多不同名称的分支,以此区分各个分支代码功能. 而随着代码的合并,以前的分支就可能不再需要保存了 ...

  4. [IOI2018]高速公路收费——二分查找+bfs

    题目链接: IOI2018highway 题目大意:给出一张$n$个点$m$条边的无向图,并给出一对未知的起点和终点,每条边都有两种边权$A$和$B$(每条边的$A$和$B$都分别相同),每次你可以设 ...

  5. 【HDU 6171】Admiral(搜索+剪枝)

    多校10 1001 HDU 6171 Admiral 题意 目标状态是第i行有i+1个i数字(i=0-5)共6行.给你初始状态,数字0可以交换上一行最近的两个和下一行最近的两个.求20步以内到目标状态 ...

  6. JLOI2015 DAY2 简要题解

    「JLOI2015」骗我呢 题意 问有多少个 \(n \times m\) 的矩阵 \(\{x_{i, j}\}\) 满足 对于 \(\forall i \in [1, n], j \in [1, m ...

  7. iis express添加虚拟目录

    在调试WEB时,还是使用IIS EXPRESS比较方便, 在IIS中,选择网站,右击,添加虚拟目录或者应用程序,就能添加虚拟目录了.. 在IIS EXPRESS中,添加虚拟目录如下 1.右击IIS E ...

  8. CSS 隐藏页面元素的 几 种方法总结

    用 CSS 隐藏页面元素有许多种方法.你可以将 opacity 设为 0.将 visibility 设为 hidden.将 display 设为 none 或者将 position 设为 absolu ...

  9. javascript之奇淫技巧

    最近准备面试,复习一下javascript,整理了一些javascript的奇淫技巧~ //为兼容ie的模拟Object.keys() Object.showkeys = function(obj) ...

  10. maven将项目及第三方jar打成一个jar包

    pom.xml中添加如下配置 把依赖包和自己项目的文件打包如同一个jar包(这种方式对spring的项目不支持) <build> <plugins> <plugin> ...