教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 求职职场 >

Hibernate对象关系映射总结(3)

来源:网络收集 时间:2026-09-13
导读: 这里如果设置了lazy:则查从表数据不会包含主表的数据:默认的是:fetch=FetchType.EAGER 其他的对象关系同样理解。 ====================================hibernate的缓存=======================================

这里如果设置了lazy:则查从表数据不会包含主表的数据:默认的是:fetch=FetchType.EAGER 其他的对象关系同样理解。

====================================hibernate的缓存========================================== 1: Session 级别的缓存,它同session邦定。它的生命周期和session相同。Session消毁,它也同时消毁,管理一级缓

存,一级缓存无法取消,用两个方法管理,clear(),evict()

2.两个session 不能共享一级缓存,因它会伴随session的生命周期的创建和消毁; 3.Session缓存是实体级别的缓存,就是只有在查询对象级别的时候才使用,如果

使用HQL和SQL是查询属性级别的,是不使用一级缓存的!切记!!!!

4: iterate 查询使用缓存,list()是通过一条SELECT SQL语句实现查询操作;而iterate()则是N+1次的SELECT

SQL语句实现查询操作,第一次它获取了所有的ID,然后再根据每个id查询所对应的对象,所以会有N+1问题出现。 查询N个对象会发N+1条sql语句。

get()和load(),iterate方法都会使用一级缓存 一级缓存无法取消,但可以管理

管理一级缓存的方法: session.clear() session.evict()

如何避免一次性大量的实体数据入库导致内存溢出: 先flush,再clear

一级缓存是缓存实体对象:如果查询普通属性,一级缓存不会缓存,会发出sql 如下:

Iterator<Category> categories2 = (Iterator<Category>)session.createQuery("select from Category a").iterate();

Hiberante3 二级缓存总结

二级缓存也称进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享 二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存

1.Hibernate3的(sessionFactory)二级缓存和session级别的缓存一样都只对实体对象做缓存,不对属性级别的查询做缓存

二级缓存的生命周期和sessionFactory的生命周期是一样的,sessionFactory可以管理二级缓存;

Hibernate对象关系映射总结

2.sessionFactory级别的缓存,需要手动配置;所有的session可以共享sessionFactory 级别的缓存;(一般把一些不经常变

化的实体对象放到sessionFactory级别的缓存中,适合放不经常变化的实体对象。)

3.Hiberante3二级缓存的配置和使用方法如下:

1:hibernate.cfg.xml 文件中配置如下:打开二级缓存:二级缓存的提供者:(依懒包:ehcache-1.2.3.jar) <property name="e_second_level_cache">true</property>

<property name="cache.provider_class">org.hibernate.cache.EhCacheProvidehcache-1.2.3.jarer</property> <property name="e_query_cache">true</property> 打开用户缓存 2:src 下需要一个配置文件:ehcache.xml 3:lib下加包:ehcache-1.2.3.jar

4:将要查询缓存的对象:在hibernate.cfg.xml 中进行配置(JPA方式) <mapping class=".hibernateTest.ehcache.Category"/> <mapping class=".hibernateTest.ehcache.Msg"/> <mapping class=".hibernateTest.ehcache.Topic"/> (xml方式)

将要查询缓存的对象:在映射文件中进行配置 <class name="Department" table="oneToManyDupDir_Department"> <cache usage="read-write"/> 一定要写在主键定义之前 <id name="id"> <generator class="native" /> </id> <property name="name"/> </class>

===================================list与iterator区别================================= 1:List 仅仅会填充二级缓存,却不能利用二级缓存:当打开查询缓存时:list能利用查询缓存。 List 是一次读出所有的数据:

2:iterator可以读二级缓存,先从缓存中取数据:没有数据时iterator首先读出所有的id.等用到时才会根据id发送sql语句从 数据库读数据.

测试list:一级缓存:当打开查询缓存时:list也能利用查询缓存*/

public void testQueryList() { Session session = sf.openSession(); session.beginTransaction(); List<Category> categories = (List<Category>)session.createQuery("from Category").list(); for(Category c : categories) {

System.out.println(c.getName()); } 对于list没法利用session级别的缓存(不知道到下次查询的条件是否一样):

还会去数据库取并且刷该缓存(将原来的对象刷新一遍)*/

List<Category> categories2 = (List<Category>)session.createQuery("from Category").list(); for(Category c : categories2) {

System.out.println(c.getName()); }

session.getTransaction().commit(); session.close();

Hibernate对象关系映射总结

} 测试iterator*/ public void testQueryIterate() { Session session = sf.openSession(); session.beginTransaction(); Iterator<Category> categories = (Iterator<Category>)session.createQuery("from Category").iterate(); 它取出所有数据的id:等到下面的用到时才根据刚才取出的id再发sql语句去取该对象*/ while(categories.hasNext()) { Category c = categories.next(); System.out.println(c.getName()); } 再次查询同样的东西时:iterator利用了session级别的缓存:不会发sql从数据库去查询*/ Iterator<Category> categories2 = (Iterator<Category>)session.createQuery("from Category").iterate(); 它还会取出所有数据的id:再从缓存中去取该对象*/ while(categories2.hasNext()) { Category c = categories2.next(); System.out.println(c.getName()); }

session.getTransaction().commit(); session.close(); }

==================================hibernate主键生成总结=======================================

***************************************对应数字型的主键********************************************* 1:oracle用序列================主键字段是数字类型 在Hibernate中使用oracle的sequence

一. 为表创建自增长字段有两种,一种是不同的表使用各自的Sequence,方法如下: 2.在你的hbm.xml中的配置

<id column="ID" name="id" type="integer"> <generator class="sequence">

<param name="sequence">HETONG_SEQ</param> </generator> </id>

在使用的时候需要注意,Hibernate对于sequence的主键的要求是一定要是shor,long,或者integer 2、native:跨数据库时使用,由底层方言产生。:这个要先建一个公共的序列:hibernate_sequence <id name="id" column="id"> <generator class="n …… 此处隐藏:3562字,全部文档内容请下载后查看。喜欢就下载吧 ……

Hibernate对象关系映射总结(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/122030.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)