Hibernate的一些相关信息(续)

深入Session

session概述

Session接口时Hibernate向应用程序提供的操纵对数据库的最主要的接口,他提供了基本的保存,更新,删除和加载Java对象的方法。

理解Session的缓存、

  • 在session借口的实现中包含一些列的Java集合,这些Java集合构成了Session缓存,只要Session实力没有结束生命周期,存放在它缓存中的对象也不会结束生命周期
  • 当session的save()方法持久化一个对象时,该对象被载入缓存,以后即使程序中不在引用该对象,只要缓存不清空,该对象仍然处于生命周期中。当时图load()对象时,会判断缓存中是否存在该对象,有则返回。没有在查询数据库

清理Session的缓存

  • Session具有一个缓存,位于缓存中的对象称为持久化对象,它和数据库中的相关记录对应,Session能够在某些时间点,按照缓存中对象的变化来执行相关的SQl语句,来同步更新数据库,这一过程被称为清理缓存(flush)
  • 默认情况下Session在以下时间点清理缓存:
    • 当应用程序调用Transaction的commit()方法时,该方法先其清理缓存(session.flush()),饭后再向数据库提交事务(tx.commit())
    • 当应用程序执行一些查询操作时,如果缓存中持久化对象的属性已经发生了变化,会先清理缓存,以保证查询结果能够反映持久化对象的最新状态
    • 显式调用Session的flush()方法
  • 区别:
    • flush:进行清理缓存(此时缓存中饭的数据并不丢失)的操作,让缓存和数据库同步执行一系列的sql语句,但不提交事务;
    • commit:先调用flush()方法,然后提交事务,则意味这提交事务对数据库的操作将会永久保存下来
    • reresh:刷新,让session和数据库同步,执行查询,把数据库的最新信息显示出来,更新本体缓存的对象状态
    • clear:清空缓存,等价于list.removeAll();

利用Session缓存读取持久化对象的数据

缓存的作用:

  1. 减少访问数据库的频率。
  2. 保证缓存中的对象与数据库中的相关记录保持同步。

Session执行批量操作

当Session执行批量操作时,应当定期的清理session的缓存下,这样才能保证足够的空间。

Hibernate检索策略

类级别检索策略

默认的检索策略是立即检索。在Hibernate映射文件中,通过<class>上配置lazy属性来确定检索策略。对于session的检索方式,类级别检索策略仅适用于load方法;也就是说,对于get、query建所以,持久化对象都会被立即加载而不管lazy时false还是true,一般来说,我们检索对象就是要访问它,英雌立即检索时通常的选择。由于load方法在检索不到对象时会抛出异常(立即检索的情况下),因此不建议使用load检索;而由于<class>中的lazy属性还影响到多对一及一对一的检索策略,因此使用load方法就更没必要了。

关联级别检索策略


fetch

(默认值select)


Lazy

(默认值是true)


策略


Join


False


采用迫切左外联接检索。


Join


True


采用迫切左外联接检索。


join


Extra


采用迫切左外联接检索。


select


False


采用立即检索


select


True


采用延迟检索


select


Extra


采用延迟检索

c.getOrders().size()  执行 select count(id) from orders where customer_id =?

for(Order o:set){ o.getOrderNumber();} 将执行:

select customer_id , id,order_number ,price from orders  where customer_id=?


subselect


false/true/extra

也分为3中情况


嵌套子查询(检索多个customer对象时) Lazy属性决定检索策略)

select customer_id,order_number,price from orders  where customer_id

in (select id from customers)


检索策略


优点


缺点


优先考虑使用的场合


立即检索


对应用程序完全透明,不管对象处于持久化状态还是游离状态,应用程序都可以从一个对象导航到关联的对象


(1)select语句多

(2)可能会加载应用程序不需要访问的对象,浪费许多内存空间。


(1)类级别

(2)应用程序需要立即访问的对象

(3)使用了二级缓存


延迟检索


由应用程序决定需要加载哪些对象,可以避免执行多余的select语句,以及避免加载应用程序不需要访问的对象。因此能提高检索性能,并节省内存空间。


应用程序如果希望访问游离状态的代理类实例,必须保证她在持久化状态时已经被初始化。


(1)一对多或者多对多关联

(2)应用程序不需要立即访问或者根本不会访问的对象


迫切左外连接检索


(1)对应用程序完全透明,不管对象处于持久化状态还是游离状态,都可从一个对象导航到另一个对象。

(2)使用了外连接,select语句少


(1)可能会加载应用程序不需要访问的对象,浪费内存。

(2)复杂的数据库表连接也会影响检索性能。


(1)多对一

(2)需要立即访问的对象

(3)数据库有良好的表连接性能。

Hibernate的检索方式

HQL(Hibernate Query Language)

  • HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL查询语言有点相似,在Hibernate提供的各种检索方式中,HQL时使用最广的一种检索方式,它有如下功能:

    • 在查询语句中设定各种查询条件
    • 支持投影查询,即仅检索出对象的部分属性
    • 支持分页查询
    • 支持连接查询
    • 支持分组查询,允许使用having和group by 关键字
    • 提供内聚聚集函数,如sum(),min(),max();
    • 能够调用用户定义的SQL函数或标准的SQL函数
    • 支持子查询
    • 支持动态绑定参数

OID检索方式

按照对象的OID来检索对象

QBC检索方式

使用QBC(Query By Criteria)API来检索对象,这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口。

简单的查询

使用别名

对查询结果排序

分页查询

setFirstResult(int firstResult);设定从哪一个对象开始检索,参数firstResult表示这个对象在查询结果中的索引位置,索引位置的起始值为0,默认情况下,Query从查询结果的第一个对象开始检索

setMaxResult(int maxResults);设定一次最多检索出的对象的数目,在默认情况下,Query和Criteria接口检索出查询结果中所有对象

Hibernate检索方式


短语


含义


Expression.eq


等于=


Expression.allEq


使用Map,使用key/value进行多个等于的判断


Expression.gt


大于>


Expression.ge


大于等于>=


Expression.lt


小于<


Expression.le


小于等于<=


Expression.between


对应sql的between子句


Expression.like


对应sql的like子句


Expression.in


对应sql的in子句


Expression.and


and 关系


Expression.or


or关系


Expression.sqlRestriction


Sql限定查询


Expression.asc()


根据传入的字段进行升序排序


Expression.desc()


根据传入的字段进行降序排序

HQL和QBC支持的各种运算


运算类型


HQL运算符


QBC运算方法


含义


比较运算


=


Express.eq()


<>


Express.not(Express.eq())


>=


Express.ge()


<


Express.lt()


<=


Express.le()


is null


Express.isNull()


is not null


Express.isNotNull()


范围运算符


In


Express.in()


not in


Express.not(Express.in())


Between


Express.between()


not between


Express.not(Express.between())


比较运算


=


Express.eq()


<>


Express.not(Express.eq())


>=


Express.ge()


<


Express.lt()


<=


Express.le()


is null


Express.isNull()


is not null


Express.isNotNull()


范围运算符


In


Express.in()


not in


Express.not(Express.in())


Between


Express.between()


not between


Express.not(Express.between())


逻辑


And


Expression.and()|

Expression.conjunction()


Or


Expression.or()|

Expression.disjunction()


Not


Expression.not()

二级缓存

缓存的概念

计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,起作用是降低应用程序直接读写永久性数据库存储源的频率,从而提高应用的运行性能。缓存中的数据是数据存储源中的数据的拷贝。缓存的物理介质通常时内存。

Hibernate中提供了两个级别的缓存

  • Session级别的缓存

    • 它时属于事务范围的缓存。这一级别的缓存有hibernate管理的,一般情况下需要进行干预
  • SessionFactory级别的缓存
    • 他是属于进程范围的缓存

启用二级缓存的条件

    • 很少被修改
    • 很少系统模块都要用到
    • 不是私有的数据,是共享的
    • 二级缓存的供应商

Hibernate的一些相关信息(续)

时间: 2024-11-12 13:42:14

Hibernate的一些相关信息(续)的相关文章

Hibernate的一些相关信息

在没有学习Hibernate之前,我们一直都是用jdbc来连接数据库和操纵数据库.所以在刚接触Hibernate时,我们都有一个疑问,为什么要学Hibernate,jdbc不是挺好的吗?那么接下来就来讲讲jdbc的优缺点与为什么要用Hibernate吧. JDBC 长处: 直接底层操作,提供了非常easy.便捷的訪问数据库的方法,跨平台性比較强.灵活性比較强,能够写非常复杂的SQL语句. 缺点: 由于JAVA时面向对象的,JDBC没有做到使数据可以面向对象的编程,是程序猿的是靠仍然停留在SQL语

nagios数据库 主机相关信息查询

mysql> select a.host_object_id,a.display_name,a.address,b.hostgroup_id,b.alias from nagios_hosts a,nagios_hostgroups b,nagios_hostgroup_members c where c.host_object_id=a.host_object_id and c.hostgroup_id=b.hostgroup_id order by b.hostgroup_id;+-----

命令行苹果 IOS MAC IPAD 所有app 的相关信息

最近因为工作需要,需要查找所有苹果IOS 上面应用的相关信息,包括APP 的名称和Identifier,如果一个应用一个应用的安装到手机上面再接通到电脑上面查找就太过费公费了,而且相当费时间和占用公司的网速了.于是自己写了一个查找这些信息的脚本程序. 安装方式是  gem install fetchapp 使用格式如下 fetchapp -t  [iphone ipad mac]  -a 没有写文档,因为没有写太多的功能,这里是一个例子 fetchapp -t iphone start requ

在linux中查询硬件相关信息

1.查询cpu的相关 a.查询CPU的统计信息 使用命令:lscpu 得到的结果如下: Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 12 On-line CPU(s) list: 0-11 Thread(s) per core: 1 Core(s) per socket: 6 Socket(s): 2 NUMA node(s): 2 Vendor ID: Genuine

MySQL查看数据库相关信息

使用MySQL时,需要了解当前数据库的情况,例如当前的数据库大小.字符集.用户等等.下面总结了一些查看数据库相关信息的命令 1:查看显示所有数据库 mysql> show databases; +--------------------+ | Database           | +--------------------+ | information_schema | | INVOICE            | | mysql              | | performance_s

微信相关信息

关注/取消关注事件<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[FromUser]]></FromUserName> <CreateTime>123456789</CreateTime> <MsgType><![CDATA[event]]></MsgType> &l

『Python』 爬取 WooYun 论坛所有漏洞条目的相关信息

每个漏洞条目包含: 乌云ID,漏洞标题,漏洞所属厂商,白帽子,漏洞类型,厂商或平台给的Rank值 主要是做数据分析使用:可以分析某厂商的各类型漏洞的统计:或者对白帽子的能力进行分析..... 数据更新时间:2016/5/27漏洞条目:104796条 数据截图如下: 数据网盘链接: 链接:http://pan.baidu.com/s/1bpDNKOv 密码:6y57 爬虫脚本: # coding:utf-8 # author: anka9080 # version: 1.0 py3 import

JAVA 读取计算机中相关信息

java读取 计算机 cup号 读取版本 显卡 ................. package com.swt.common.util; import java.io.BufferedReader; import java.io.File; import java.io.FileWriter; import java.io.InputStreamReader; import java.io.LineNumberReader; /** * 获取硬件信息 * @author luoxf * */

把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息提交给DedeCms

把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息提交给DedeCms官方.Duplicate entry '2′ for key 'PRIMARY' 你的主键是不可重复的,现在重复插入值为3的主键了.可以去掉主键唯一,或是设成自增加.就不会出现这种情况了. 具体操作: 进入后台,"系统" - "系统设置" - "SQL命令行工具" 运行SQL命令行: alter table dede_addonarticle