hibernate的学习周

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文件中了

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

时间: 2024-12-26 10:31:32

hibernate的学习周的相关文章

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

稍稍乱入的CNN,本文依然是学习周莫烦视频的笔记. 还有 google 在 udacity 上的 CNN 教程. CNN(Convolutional Neural Networks) 卷积神经网络简单讲就是把一个图片的数据传递给CNN,原涂层是由RGB组成,然后CNN把它的厚度加厚,长宽变小,每做一层都这样被拉长,最后形成一个分类器: 如果想要分成十类的话,那么就会有0到9这十个位置,这个数据属于哪一类就在哪个位置上是1,而在其它位置上为零. 在 RGB 这个层,每一次把一块核心抽出来,然后厚度

hibernate的学习心得(引用知乎的一个author)

这篇文章引用于知乎的一个author的观点,原文也是直接copy,我个人觉得这篇文章最厉害的是最后的一段话,深刻的见地啊! 下面是原文: Hibernate入门容易,掌握精通我也不敢自夸.我第一遍看Hibernate文档的时候也觉得很吃力,但不是因为Hibernate难掌握而感到吃力,是因为Hibernate文档处处都是持久层设计的经验和最佳实践. ###adv### Hibernate文档准确的来说,绝大部分内容都在讲对象的持久层设计,而不是简单的Hibernate使用,使用问题查Java d

Hibernate入门学习-安装hibernate插件

最近一直在学习ssh框架,为了更方便hibernate的使用,所以在eclipse下载hibernate插件,安装插件有两种方法 第一种:本地安装 1).插件的官网下载地址:http://tools.jboss.org/downloads/,选择你要安装的插件,如图所示: 2).打开eclipse->help->Install New Software->Add 3).选择你需要要安装的插件.不要勾选更新,否则需要联网下载,然后一直next就好了! 第二种:在线安装: Help >

hibernate 框架学习笔记---网上摘抄的一个非常好的例子

编写Spring+Hibernate框架下的应用,总是离不了编写一个通用的泛型GenericHibernateDao.查阅了网上不少的GenericHibernateDao实现,归纳整理为如下实现,供后续编码参考. 首先定义接口泛型DAO接口 GenericDao package com.th.huz; import java.io.Serializable;import java.util.Collection;import java.util.Iterator;import java.uti

201671010127 2016—2017—2 Java学习周结

时间真是个最公平东西,只要能够好好地利用它,它可以为我们带来我们我们所想要的东西.学习Java已经有一周了,对于Java基础知识的认识也更进一步,对Java的兴趣也愈来愈浓.实现一个Java程序,主要有三个步骤:第一步是编写Java源代码,第二步是编译源代码,第三步是运行Java程序.Java源代码必须要经过编译之后才能由JVM(Java虚拟机)解析执行.Java源代码文件其实就是一个后缀名为.java的普通文本文件,可以用记事本或者在(集成开发环境)里面编写. 对于一个Java源程序,其分析如

学习周总结

时间的话没注意.不过这周HTML学习把上周的时间和关卡加上去了.数据结构的话,学习了树的概念与存储原理,代码的话是在老师给的基础上改的.这周看了本毕淑敏写的散文,其中一篇是旅游是我们谦虚,感同身受,出去走走,才能让我发现世界有多大,不然老宅在一个地方可能让我的视野狭小,胸怀仄斜.旅游正是以一种充满未知的魅力,激起人们不倦的向往. <html xmlns="http://www.w3.org/1999/xhtml"> <meta http-equiv="Con

【大话hibernate】hibernate系统学习大合集

转载请注明出处:http://blog.csdn.net/column/details/hibernatebylmb.html 为了方便各位网友学习以及方便自己复习之用,将Jhibernate系统学习的系列内容按照由浅入深的学习顺序总结如下,点击相应的标题即可跳转到对应的文章. Hibernate的jar包的用途 Hibernate基本原理及概念详解 JDBC操作与hibernate的区别 Hibernate查询语言HQL详解 hibernate主键生成策略与配置详解 Hibernate两种实体

j2ee开发之hibernate框架学习笔记

hibernate框架技术重点学习笔记 1.针对不同的数据库,有不同的数据库实现类,使其符号对应的数据库? mysqlDaoImpl oracleDaoImpl ... ... 2.对象和表记录的转换存在着转换问题->orm,对象和关系的一种映射 3.框架:解决一种问题的方案集合! 4..配置文件 Xxx.cfg.xml  主配置文件 xxx.hbm.xml映射文件: 映射基础 普通属性 主键 集合属性 关联关系:一对多  多对一 多对多  一对一 继承结构 5.其他特性:数据库连接池  懒加载

hibernate映射学习(三)

在前面几篇文章中,分别学习了hibernate的关联映射,基本的一对一,一对多,多对 多等都有学习,今天我会给大家带来hibernate中关于"组合映射"和"继承映射"的学习. ## 组合映射## 为什么要学习组合映射,它和一般的映射有什么区别吗??我们先来看一下下面这种情况: 上图,可以看出,user包含了username,address包含了homeaddress,contact包含了qq,phone,这些字段,由于这些属性没有什么必然联系,我们可以将这些字段放