Hibernate--day04

非本人总结的笔记,抄点笔记复习复习。感谢传智博客及黑马程序猿


记笔记啊记笔记

Inverse属性

Inverse属性是Hibernate中的一种优化方式

有一对多关系,之前做法,是在双向维护外键关系,但是造成浪费。让一的那一方放弃关系维护,把关系维护都交给多的那一方操作。

//查询id=3的订单
Orders order = (Orders) session.get(Orders.class, 3);
//cid=2的用户
Customer customer = (Customer) session.get(Customer.class, 2);
//用户里面有订单
customer.getOrders().add(order);
//订单里面有用户
order.setCustomer(customer);

对外键的修改,修改了两次,因为双向维护外键

<!-- inverse="false"  不放弃维护
     inverse="true"   放弃维护-->
<set name="setOrders" inverse="true"></set>

Inverse属性默认属性值是false

最终只是发送一条修改语句,修改数据

本地session的管理

线程与进程

使用session和本地线程绑定在一起。

可以使用sessionFactory里面的方法得到这个与本地线程绑定的session

第一步

在核心文件里面配置与本地线程绑定的session

<property name="hibernate.current_session_context_class">thread</property>

第二步

使用sessionFactory获取到与本地线程绑定的session

public static Session getCurrentSession() {
    Session session = sessionFactory.getCurrentSession();
    return session;
}

操作之后,session不需要手动关闭了,线程结束之后,session自动关闭

org.hibernate.SessionException:Session was already closed

Hibernate的二级缓存

什么是二级缓存

Hibernate有两个级别的缓存

一级缓存:默认是打开的,是session范围的缓存,session一旦关闭,一级缓存也就没有了

二级缓存: 默认不是打开的,手动配置,二级缓存使用需要依赖第三方插件(供应商)。二级缓存的范围是sessionFactory范围的缓存。二级缓存可以被多个session共享。

如图

二级缓存存储结构

二级缓存存储结构

类缓存区:查询之后返回对象的值

集合缓存区:查询之后返回的set集合

查询缓存区:查询的对象中部分的属性值

更新时间戳区:判断二级缓存数据是否是最新数据

二级缓存的存放数据

二级缓存可以被多个session共享

适合放数据 不适合放的数据
不重要的数据 财务数据
不经常修改的数据 经常修改的数据

二级缓存的配置

第一步

导入供应商(插件)的jar包,把插件配置文件放到src下面

第一步

第二步

在核心配置文件中开启二级缓存

<!-- 打开Hibernate的二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>

第三步

配置使用哪一个供应商(插件)

<!-- 配置二级缓存供应商 -->
<property name="hibernate.cache.provider_class">
    org.hibernate.cache.EhCacheProvider
</property>

第四步

配置哪些数据进行二级缓存

配置方式

第一种

在实体类映射文件中配置

第二种

在核心配置文件中配置哪些实体类数据要进行二级缓存

<!-- 配置实体类进行二级缓存 -->
<class-cache usage="read-write" class="cn.xxx.Customer"></class-cache>
<class-cache usage="read-write" class="cn.xxx.Orders"></class-cache>

测试二级缓存

创建第一个session,在这个session根据oid查询记录

创建第二个session,在这个session里面查询和第一个session相同的记录

//发送sql语句查询数据库
Customer c1 = (Customer) session.get(Customer.class, 1);
System.out.println(c1);
session.close();

//创建第二个session
session1 = HibernateUtils.getSession();
//没有发送sql语句
Customer c2 = (Customer) session1.get(Customer.class, 1);
System.out.println(c2);
session1.close();

类缓存区

类缓存区缓存数据查询之后返回的对象值,在类缓存区里面存的不是整个对象,存的是对象的零散的数据。必须存完整数据

类缓存区

集合缓存区

缓存是set集合内容。集合缓存区里面存储的是set集合里面每个对象的oid值。

首先,进行配置,集合缓存区依赖于类缓存区

<!-- 配置实体类进行二级缓存配置 -->
<class-cache usage="read-write" class="cn.xx.Customer"/>
<class-cache usage="read-write" class="cn.xx.Orders"/>

<!-- 配置集合缓存区 -->
<collection-cache usage="read-write" collection="cn.xx.Customer.setOrder"/>

演示集合缓存区

第一个session里面,先根据cid查询用户,在查询用户的所有订单

第二个session里面,根据cid查询用户,在查询用户的所有的订单

//创建第一个session
Session session1 = HibernateUtils.getSession();
//查询用户
Customer c1 = (Customer) session1.get(Customr.class, 2);
//查询用户的所有订单
Set<Orders> setOrders = c1.getSetOrders();
System.out.println(setOrders.size());

session1.close();

//创建第二个session
session1 = HibernateUtils.getSession();
//查询用户
Customer c2 = (Customer) session1.get(Customr.class, 2);
//查询用户的所有订单
Set<Orders> setOrders2 = c2.getSetOrders();
System.out.println(setOrders2.size());

一级缓存更新数据会同步到二级缓存

Session session1 = HibernateUtils.getSession();
Transaction tx = session1.beginTransaction();
//查询用户
Customer c1 = (Customer) session1.get(Customer.class, 4);
System.out.println(c1);
c1.setName("Lucy");
tx.commit();
session1.close();

session1 = HibernateUtils.getSession();
Transaction tx2 = session1.beginTransaction();

Customer c2 = (Customer) session1.get(Customer.class, 4);
System.out.println(c2);
tx2.commit();
session1.close();

更新时间戳区

判断缓存中的数据是否是最新的数据

时间戳区

查询缓存区

可以缓存部分属性

第一步

配置打开查询缓存区

<!-- 打开查询缓存 -->
<property name="hibernate.cache.use_query_cache">true</property>

第二步

查询数据的时候,调用方法

//查询用户
Query query = session1.createQuery("select cname from Customer");
//调用方法
List list = query.setCacheable(true).list();
System.out.println(list);

tx.commit();
session1.close();

//创建第二个session
session1 = HibernateUtils.getSession();
Transaction t = session1.beginTransaction();
//查询用户
Query q = session1.createQuery("select cname from Customer");
//调用方法
List l = q.setCacheable(true).list();
System.out.println(l);

Hibernate中c3p0连接池配置

c3p0配置
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容

  • Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库...
    兰缘小妖阅读 1,195评论 1 18
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,514评论 18 399
  • web service 相关 什么是Web Service? 答:从表面上看,Web Service就是一个应用程...
    niuben阅读 890评论 0 3
  • Hibernate: 一个持久化框架 一个ORM框架 加载:根据特定的OID,把一个对象从数据库加载到内存中OID...
    JHMichael阅读 1,950评论 0 27
  • 细数起来,从去年7月份开始写新媒体文章算起,迄今为止已经断断续续写了15万多字了。但如果按照现行新媒体界的评判标准...
    危笑天阅读 1,203评论 7 21