hibernate懒加载策略

hibernate懒加载策略
hibernate懒加载策略

所谓懒加载(lazy)就是延时加载

至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限,为了减少并发量,减少系统资源的消耗,我们让数据在需要的时候才进行加载,这时我们就用到了懒加载。

hibernate3.0中lazy有三个值,true,false,proxy,默认的是lazy="proxy".

比如部门ENTITY和员工ENTITY,部门与员工1对多,如果lazy设置为false,那么只要加载了一个部门的po,就会根据一对多配置的关系把所有员工的po也加载出来。但是实际上有时候只是需要用到部门的信息,不需要用到员工的信息,这时员工po的加载就等于浪费资源。如果lazy设置为true,那么只有当你访问部门po的员工信息时候才回去加载员工的po的信息。

延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。

A、实体对象的延迟加载

如果想对实体对象使用延迟加载,必须要在实体的映射配置文件中进行相应的配置,如下所示:

U_ID

通过将class的lazy属性设置为true,来开启实体的延迟加载特性。如果我们运行下面的代码:

User user=(User)session.load(User.class,”1”);

System.out.println(user.getName());

观察此时user对象的内存快照,会惊奇的发现,此时返回的可能是User$EnhancerByCGLIB$$bede8986类型的对象,而且其属性为null,这是怎么回事?session.load()方法会返回实体对象的代理类对象,这里所返回的对象类型就是User对象的代理类对象。在Hibernate中通过使用 CGLIB,来实现动态构造一个目标对象的代理类对象,并且在代理类对象中包含目标对象的所有属性和方法,而且所有属性均被赋值为null。通过调试器显示的内存快照,可以看出此时真正的User对象,是包含在代理对象的CGLIB$CALBACK_0.target属性中,当代码运行到(2)处时,此时调用user.getName()方法,这时通过CGLIB赋予的回调机制,实际上调用CGLIB$CALBACK_0.getName()方法,当调用该方法时,Hibernate会首先检查CGLIB$CALBACK_0.target属性是否为null,如果不为空,则调用目标对象的getName 方法,如果为空,则会发起数据库查询,生成类似这样的SQL语句:select * from user where id=’1’;来查询数据,并构造目标对象,并且将它赋值到CGLIB$CALBACK_0.target属性中。

这样,通过一个中间代理对象,Hibernate实现了实体的延迟加载,只有当用户真正发起获得实体对象属性的动作时,才真正会发起数据库查询操作。所以实体的延迟加载是用通过中间代理类完成的,所以只有session.load()方法才会利用实体延迟加载,因为只有session.load()方法才会返回实体类的代理类对象。

B、集合类型的延迟加载

在Hibernate的延迟加载机制中,针对集合类型的应用,意义是最为重大的,因为这有可能使性能得到大幅度的提高,为此Hibernate进行了大量的努力,其中包括对JDK Collection的独立实现,在一对多关联中,定义的用来容纳关联

对象的Set集合,并不是java.util.Set类型或其子类型,而是

net.sf.hibernate.collection.Set类型,通过使用自定义集合类的实现,Hibernate实现了集合类型的延迟加载。为了对集合类型使用延迟加载,必须如下配置实体类的关于关联的部分:

……

inverse=”true”>

通过将元素的lazy属性设置为true来开启集合类型的延迟加载特性。看下面的代码:

User user=(User)session.load(User.class,”1”);

Collection addset=user.getAddresses(); (1)

Iterator it=addset.iterator(); (2)

while(it.hasNext()) {

Address address=(Address)it.next();

System.out.println(address.getAddress());

}

当程序执行到(1)处时,并不会发起对关联数据的查询来加载关联数据,只有运行到(2)处时,真正的数据读取操作才会开始,这时Hibernate会根据缓存中符合条件的数据索引,来查找符合条件的实体对象。

这里引入了一个全新的概念——数据索引,下面首先将说明什么是数据索引。在Hibernate中对集合类型进行缓存时,是分两部分进行缓存的,首先缓存集合中所有实体的id列表,然后缓存实体对象,这些实体对象的id列表,就是

所谓的数据索引。当查找数据索引时,如果没有找到对应的数据索引,这时就会一条select SQL的执行,获得符合条件的数据,并构造实体对象集合和数据索引,然后返回实体对象的集合,并且将实体对象和数据索引纳入Hibernate的缓存之中。另一方面,如果找到对应的数据索引,则从数据索引中取出id列表,然后根据id在缓存中查找对应的实体,如果找到就从缓存中返回,如果没有找到,在发起select SQL查询。在这里我们看出了另外一个问题,这个问题可能会对性能产生影响,这就是集合类型的缓存策略。如果如下配置集合类型:

inverse=”true”>

这里应用了配置,如果采用这种策略来配置集合类型,Hibernate将只会对数据索引进行缓存,而不会对集合中的实体对象进行缓存。如上配置运行下面的代码:

User user=(User)session.load(User.class,”1”);

Collection addset=user.getAddresses();

Iterator it=addset.iterator();

while(it.hasNext()) {

Address address=(Address)it.next();

System.out.println(address.getAddress());

}

System.out.println(“Second query……”);

User user2=(User)session.load(User.class,”1”);

Collection it2=user2.getAddresses();

while(it2.hasNext()) {

Address address2=(Address)it2.next();

System.out.println(address2.getAddress());

}

运行这段代码,会得到类似下面的输出:

Select * from user where id=’1’;

Select * from address where user_id=’1’;

Tianjin

Dalian

Second query……

Select * from address where id=’1’;

Select * from address where id=’2’;

Tianjin

Dalian

可以看到,当第二次执行查询时,执行了两条对address表的查询操作,为什么会这样呢?这是因为当第一次加载实体后,根据集合类型缓存策略的配置,只对集合数据索引进行了缓存,而并没有对集合中的实体对象进行缓存,所以在第二次再次加载实体时,Hibernate找到了对应实体的数据索引,但是根据数据索引,却无法在缓存中找到对应的实体,所以Hibernate根据找到的数据索引发起了两条select SQL的查询操作,这里造成了对性能的浪费,怎样才能避免这种情况呢?必须对集合类型中的实体也指定缓存策略,对集合类型进行配置:

……

inverse=”true”>

此时Hibernate会对集合类型中的实体也进行缓存,再次运行上面的代码,将会得到类似如下的输出:

Select * from user where id=’1’;

Select * from address where user_id=’1’;

Tianjin

Dalian

Second query……

Tianjin

Dalian

这时将不会再有根据数据索引进行查询的SQL语句,因为此时可以直接从缓存中获得集合类型中存放的实体对象。

C、属性延迟加载

在Hibernate3中,引入了一种新的特性——属性的延迟加载,这个机制又为获取高性能查询提供了有力的工具。在大数据对象读取时,假设在User 对象中有一个resume字段,该字段是一个java.sql.Clob类型,包含了用户的简历信息,当加载该对象时,不得不每一次都要加载这个字段,而不论是否真的需要它,而且这种大数据对象的读取本身会带来很大的性能开销。在Hibernate2中,只有通过面向性能的粒度细分,来分解User类,来解决这个问题,但是在Hibernate3中,可以通过属性延迟加载机制,来使我们获得只有当我们真正需要操作这个字段时,才去读取这个字段数据的能力,为此必须如下配置实体类:

……

column=”resume” lazy=”true”/>

通过对元素的lazy属性设置true来开启属性的延迟加载,在Hibernate3中为了实现属性的延迟加载,使用了类增强器来对实体类的Class 文件进行强化处理,通过增强器的增强,将CGLIB的回调机制逻辑,加入实体类,这里我们可以看出属性的延迟加载,还是通过CGLIB来实现的。CGLIB是Apache 的一个开源工程,这个类库可以操纵java类的字节码,根据字节码来动态构造符合要求的类对象。根据上面的配置我们运行下面的代码:

String sql=”from User user where https://www.360docs.net/doc/b83888517.html,=’zx’ ”;

Query query=session.createQuery(sql); (1)

List list=query.list();

for(int i=0;i

User user=(User)list.get(i);

System.out.println(user.getName());

System.out.println(user.getResume()); (2)

}

当执行到(1)处时,会生成类似如下的SQL语句:

Select id,age,name from user where name=’zx’;

这时Hibernate会检索User实体中所有非延迟加载属性对应的字段数据,当执行到(2)处时,会生成类似如下的SQL语句:

Select resume from user where id=’1’;

这时会发起对resume字段数据真正的读取操作。

检索策略

汽车尾气的排放控制新技术 第二部分:检索策略部分 1.课题分析 交通系统消耗了全球约1/3 的能源,以石油产品为燃料的汽车是最主要的现代交通运输工具,它给人们带来方便和快捷的同时,也带来了无法回避的问题。根据上个世纪七八十年代美国、日本对城市空气污染源的调查,城市空气中90%以上的一氧化碳、60%以上的碳氢化合物和30%以上的氮氧化物都来自汽车尾气的排放,这些污浊的气体使人类的生存环境受到极大威胁。汽车污染已成为世界性公害,其对于温室气体浓度增加的“贡献”不容忽视。随着世界各国汽车保有量的增加,汽车已成为城市大气质量恶化的主要污染源,其排放的CO、NOx、HC、SO2、Pb 等污染物不仅危害人体健康,还是造成酸雨和光化学烟雾的主要成分,汽车尾气污染已受到全球广泛的注视。截止2006年底,我国民用汽车保有量已接近3700万辆,并仍保持着快速增长的趋势。虽与发达国家相比,其总量不多,但由于主要集中在大城市,而且车况差,燃油质量低,单车的排污量往往高出国外同类车的几倍,汽车尾气对我国城市空气质量造成巨大的威胁。因此,研究汽车尾气的排放控制的新技术,减少有害气体的排放量,对提高城市空气的质量,保障人类生存环境,具有重大意义。本作业利用自己这学期所学的文献检索课的知识,检索了国内有关汽车尾气的排放、控制、净化方面的文献,经初步整理给出一篇肤浅的文献综述,有望老师给予指正。 2. 制定检索策略 2.1 选择检索工具

2.2 选择检索词 2.3 拟定检索式 由于不同检索工具的字段不同,因此将检索式(亦称提问式)在“检索步骤及检索结果”的各个具体检索工具中给出。 3. 检索步骤及检索结果 3.1 谷歌搜索引擎 3.1.1 检索式 A.篇名=汽车 and 尾气 and 排放and 控制 3.1.2 检索步骤与结果 打开谷歌高级搜索:在第一行检索框内输入检索式A,“and”用空格形式表示。限定在“简体中文”和“网页标题”内检索。得到212条检索结果。经过筛选,选择其中2条: [1] 【篇名】申城推广燃油清净剂控制汽车尾气排放 【摘要】有关研究及开发证明,在燃油中添加合格的清净剂,能明显降低一氧化碳、碳氢化合物、氮氧化物和颗粒物等污染的排放量,而且能使节油率达到15%左右,燃油清净剂技术已成为我国在治理汽车尾气污染的一项高新技术。据了解,目前日本有80%的车用汽油使用汽油清净剂,欧美19个国家普遍使用汽油清净剂。上海目前机动车尾气污染仍十分严重,改善废气排放迫在眉睫。为此许多专家认为,上海应当大力推广燃油清净剂。 【出处】解放日报2002年3月27日 [2] 【篇名】控制尾气排放新方法-汽车试“喝”纳米燃油 【摘要】普通汽车上通过加装一套EPS纳米燃油装置,就可以节省燃油10%-30%,降低尾气排放约50%-90%,同时还能使动力增加10%-30%。日前,一种可将普通燃油变成纳米燃油

hibernate练习题

1.下面创建Criteria对象的语句中正确的是 单选 A、Criteria c = query.createCriteria(); B、Criteria c = query.addCriteria(); C、Criteria c = session.createCriteria(); D、Criteria c = session.createCriteria(User.class); 2. Query对象执行查询结论正确的是 多选 A、list()方法返回结果为List对象,数据总量为0到多条 B、uniqueResut()方法返回结果为对象或对象数组,数据总量为0到1条数据 C、HQL:select userName from UserModel可以使用list()方法进行查询结果的获取 D、HQL:select userName from UserModel可以使用uniqueResut()方法进行查询结果的获取 3Hibernate实体对象制作规范不包含下列哪条规则 单选 A、声明无参公共的构造方法 B、提供用于作为OID的标识属性 C、为所有属性提供getter与setter方法 D、声明为最终类(final修饰) 4在HQL语句的参数查询中,执行以下代码,下列选项能够为参数正确赋值的操作是Query query = s.createQuery("from Customer o where https://www.360docs.net/doc/b83888517.html,=?"); 单选 A、query.setParameter(1, "Tom"); B、query.setParameter(0, "Tom"); C、query.setString(0,Tom); D、query.setInteger (0,Tom); 5有关Hibernate瞬时对象状态说法错误的是 多选 A、瞬时状态的对象具有OID,与Session对象关联 B、瞬时状态的对象具有OID,不与Session对象关联 C、瞬时状态的对象不具有OID,与Session对象关联 D、瞬时状态的对象不具有OID,不与Session对象关联 6有关QBC查询短语,下列说法正确的 多选 A、Restrictions.between表示范围比对 B、Restrictions.eq表示等比对 C、Restrictions.le表示小于等于比对 D、Restrictions.ge表示大于等于比对 7下列操作对一级缓存的影响描述错误的是

Hibernate3.6(开发必看)

1.Java对象持久化概述 1.1.应用程序的分层体系结构 1.1.1.基于B/S的典型三层架构 说明: 1,展现层:提供与用户交互的界面。 2,业务逻辑层:实现各种业务逻辑。 3,数据访问层:负责存放和管理应用程序的持久化业务数据。 1.1. 2.数据访问层与Hibernate在Java应用程序中的 角色 数据访问层(持久化层)封装了数据访问的细节,为业务逻辑层提供了面向对象的API。完善的持久化层应该达到的目标: 1,代码重用性高,可完成所有的数据访问操作。 2,如果需要的话,能够支持多种数据库平台。 3,具有相对独立性,当持久化层变化时,不会影响上层实现。 在数据访问层(持久化层)中可以使用Hibernate框架以实现要求,如下图所示:

1.2.软件模型 1.2.1.各种模型的说明 概念模型: 模拟问题域中的真实实体。描述每个实体的概念和属性及实体间关系。不描述实体行为。实体间的关系有一对一、一对多和多对多。。 关系数据模型: 在概念模型的基础上建立起来的,用于描述这些关系数据的静态结构。有以下内容组成:1,若干表 2,表的所有索引 3,视图 4,触发器 5,表与表之间的参照完整性

域模型: 在软件的分析阶段创建概念模型,在软件设计阶段创建域模型。 组成部分: 1,具有状态和行为的域对象。 2,域对象之间的关联。 域对象(domain object): 构成域模型的基本元素就是域对象。对真实世界的实体的软件抽象,也叫做业务对象(Business Object,BO)。域对象可代表业务领域中的人、地点、事物或概念。 域对象分为以下几种: 1,实体域对象:通常是指业务领域中的名词。(plain old java object,简单Java 对象)。 2,过程域对象:应用中的业务逻辑或流程。依赖于实体域对象,业务领域中的动词。如发出订单、登陆等。 3,事件域对象:应用中的一些事件(警告、异常)。 1.2.2.域对象间的关系 关联: 类间的引用关系。以属性定义的方式表现。

检索策略及检索过程

检索过程及检索策略 信息检索的全过程大概分为六个步骤:分析课题、选择检索工具、确定检索途径、选定检索方法、查找文献线索、索取原始文献。 一、分析课题 GIS在医药行业的应用研究与探索。概述地理信息系统技术在现代医药行业的应用探索与研究,重点介绍GIS在公共卫生与疾病领域、药品监管、医药商业等领域的应用,并讨论了这些基础在应用过程中存在的问题。将GIS技术应用于医药行业以解决现阶段存在的一些问题,将会给医药行业带来更好的发展。 二、检索工具 首先使用学校的购买的资源,比如CNKI、万方、sciencedirect等,由于我们学校只买了医药方面的数据库权限,没有购买计算机方面的权限,所以就通过网上找的一些代理和其他学校VPN、MD、ezproxy等,通过获得的账号可以访问其他学校的资源,下载全文文献。 三、确定检索途径、方法以及策略 检索途径:主要运用了题名检索、机构检索、主题检索和关键词检索等。首先在CNKI中,使用“GIS”作为题目检索项进行跨库检索,获得文献24978篇,其中大部分文献都是以介绍GIS在各个行业的应用,其应用范围主要集中在工程利于,比如物流、商业分析等。但也有不少文献讲述了GIS在中药种植方面的应用。总体说来,在CNKI中的检索得到的文献与预期不是很符合。然后又在硕士博士数据库中重新选取关键词进行筛选,筛选了相关部分的一些文献。 再次检索:使用Google学术进行检索。使用高级检索“在文中标题中”进行检索,获得GIS相关综述类文献(根据之前的经验,分别针对包含和不包含“医药行业”关键字进行检索,获得一些其他方面信息),下载引用数靠前的文献,用作综述中简述、医药行业的应用以及一些研究进展。并将这部分文献的标引信息导入Endnote中备用。 补充检索:这一部分主要针对在进行综述写作中遇到的一些不够清楚和详细的问题进行检索。这部分内容主要在各种相关专业的数据库和期刊中进行检索。有时候还会用到维基百科、百度百科中相关的专业术语的解释,以易于理解。 在检索策略制定的时候主要通过两种方法,通过关键词组合。第一、在所检索的数据库主题词与自由词并用时,首先先从相应的主题词表中选择所需的检索词,这样一般都能够找到最佳的检索结果。第二、在没有确切的表达课题内容的主题词时,采用了自由词检索,在检索词确定的时候,主要参考国际上通用的、文献中提过的术语。有时候自己也尝试了一些符合逻辑运算的检索式。不过在检索过称中会不断的调整

缓存机制

3.1、缓存策略 3.1.1、一级缓存 之前每一个数据库操作都是一个Session,那么对于Session来说本身是存在着缓存,可以保留之前的查询结果。 但是对于Session的缓存只针对于一个Session有效,那么如果现在想针对于多个Session 有作用,则必须在SessionFactory上配置缓存,那么这样的缓存称为二级缓存。 在Hiernate按ID查询有两个方法:load、get 那么下面使用以上的查询方法,查询两次 程序虽然调用了两次load方法,但是只发出了一条的查询命令,证明,第一次的查询结果被保存下来了,那么这就是一级缓存。

与之前的相比,查询了两次操作,所以此时,证明一级缓存只是针对于一个Session起作用的。但是一级缓存是无法关闭的,始终会存在。

从运行结果可以发现,如果之前先进行了保存操作,那么之后再查询的话也不会重新发出查询语句。证明实体被缓存下来。 问题: 如果现在要求使用程序插入100000万条记录?该怎么办? 如果使用Hibernate处理的话,则可能会出现内存的溢出,所以在这种情况下首先是绝对不建议使用Hibernate完成的,就使用最基本的JDBC操作完成即可。 如果非要使用Hibernate做,则必须使用到Session中关于缓存的一些操作方法:·清空Session中的所有缓存:clear() ·清空Session中一个指定的实体:evict(Object obj) 例如:下面验证clear()方法 因为程序中,将所有的缓存清空了,所以之后再查询相同实体的时候,在Session中已

以上因为只清空了一个实体,所以只发出了三个查询语句。 那么就可以通过以上的方式完成100W条记录的插入 思路:按照每十条清空缓存的操作,并将缓存中的内容强制性的写到数据库之中 3.1.2、二级缓存(重点) 在Hibernate本身中支持了多种的二级缓存组件。本次使用EHcache。如果要想使用ehcache话,则首先必须进行配置,配置ehcache的缓存文件。 ehcache.xml:

hibernate配置数据库连接池的三种方法

?数据库连接池的概念(是什么,做什么用的,有什么好处) ?首先,我们还是老套的讲讲连接池的基本概念,概念理解清楚了,我们也知道后面是怎么回事了。?以前我们程序连接数据库的时候,每一次连接数据库都要一个连接,用完后再释放。如果频繁的数据库操作,就会导致性能很低。连接池的出现,为开发过程提供了一个很好的管理平台。当程序中需要建立数据库连接时,只须从内存中取一个来用而不用新建。同样,使用完毕后,只需放回内存即可。而连接的建立、断开都有连接池自身来管理。同时,我们还可以通过设置连接池的参数来控制连接池中的连接数、每个连接的最大使用次数等等。通过使用连接池,将大大提高程序效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。 ?而Hibernate的出现把连接池的使用引入了一个新的利用方式,让你充分享受配置化给开发带来的便利。 1 C3P0 (以验证可用) 只需在hibernate.cfg.xml中加入 omdssd_admin omdssd_hskj jdbc:oracle:thin:@10.142.1.138:1521:omds oracle.jdbc.driver.OracleDriver org.hibernate.dialect.Oracle9Dialect true true oracle10g_112 org.hibernate.connection.C3P0ConnectionProvider 5 //连接池中数据库连接的最小数目 30 //连接池中数据库连接的最大数目 1800 //设定数据库连接的过期时间,以秒为单位 50 //可以被缓存的PreparedStatement实例的最大数目。缓存适量的PreparedStatement实例,能够大大提高Hibernate的性能。 120//在使数据库连接自动生效之前处于空闲状态的时间,以秒为单位

Hibernate性能调优

Hibernate性能调优 关键字: hibernate性能调优 一、inverse = ? inverse=false(default) 用于单向one-to-many关联 parent.getChildren().add(child) // insert child parent.getChildren().delete(child) // delete child inverse=true 用于双向one-to-many关联 child.setParent(parent); session.save(child) // insert child session.delete(child) 在分层结构的体系中 parentDao, childDao对于CRUD的封装导致往往直接通过session接口持久化对象,而很少通过关联对象可达性 二、one-to-many关系 单向关系还是双向关系? parent.getChildren().add(child)对集合的触及操作会导致lazy的集合初始化,在没有对集合配置二级缓存的情况下,应避免此类操作 select * from child where parent_id = xxx; 性能口诀: 1. 一般情况下避免使用单向关联,尽量使用双向关联

2. 使用双向关联,inverse=“true” 3. 在分层结构中通过DAO接口用session直接持久化对象,避免通过关联关系进行可达性持久化 三、many-to-one关系 单向many-to-one表达了外键存储方 灵活运用many-to-one可以避免一些不必要的性能问题 many-to-one表达的含义是:0..n : 1,many可以是0,可以是1,也可以是n,也就是说many-to-one可以表达一对多,一对一,多对一关系 因此可以配置双向many-to-one关系,例如: 1. 一桌四人打麻将,麻将席位和打麻将的人是什么关系?是双向many-to-one的关系 四、one-to-one 通过主键进行关联 相当于把大表拆分为多个小表 例如把大字段单独拆分出来,以提高数据库操作的性能 Hibernate的one-to-one似乎无法lazy,必须通过bytecode enhancement 五、集合List/Bag/Set

JAVA复试问题答案

(一) JAVA复试的问题整理 1 Hibernate 的优化流程是如何实现的,流程是怎么样? 1.尽量使用many-to-one,避免使用单向one-to-many 2.灵活使用单向one-to-many 3.不用一对一,使用多对一代替一对一 4.配置对象缓存,不使用集合缓存 5.一对多使用Bag 多对一使用Set 6.继承使用显示多态 HQL:from object polymorphism="exlicit" 避免查处所有对象 7.消除大表,使用二级缓存 2 Struts1与Struts2的区别? 在Action 实现类方面的对比:Struts 1 要求Action 类继承一个抽象基类;Struts 1 的一个具体问题是使用抽象类编程而不是接口。Struts 2 Action 类可以实现一个Action 接口,也可以实现其他接口,使可选和定制的服务成为可能。Struts2 提供一ActionSupport 基类去实现常用的接口。即使 Action 接口不是必须实现的,只有一个包含execute 方法的POJO 类都可以用作 Struts 2 的Action 。 线程模式方面的对比:Struts 1 Action 是单例模式并且必须是线程安全的,因为仅有Action 的一个实例来处理所有的请求。单例策略限制了Struts 1 Action 能做的事,并且要在开发时特别小心。Action 资源必须是线程安全的或同步的;Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。 Servlet 依赖方面的对比:Struts 1 Action 依赖于 Servlet API,因为Struts 1 Action 的execute 方法中有HttpServletRequest 和HttpServletResponse 方法。Struts 2 Action 不再依赖于 Servlet API,从而允许Action 脱离Web 容器运行,从而降低了测试Action 的难度。当然,如果Action 需要直接访问HttpServletRequest 和HttpServletResponse 参数,Struts 2 Action 仍然可以访问它们。但是,大部分时候,Action 都无需直接访问HttpServetRequest 和HttpServletResponse,从而给开发者更多灵活的选择。 可测性方面的对比:测试Struts 1 Action 的一个主要问题是execute 方法依赖于Servlet API,这使得Action 的测试要依赖于Web 容器。为了脱离Web 容器测试 Struts1

Hibernate_测试题

medal.setType("Gold Medal"); session.save(user); session.close(); } A.配置文件配置有误 B.没有在配置文件中包含对映射文件的声明 C.映射文件配置有误 D.没有开启事务 5.下列属于多对一关系的是(bd )。(选两项) A.书和作者 B.手机和生产厂家 C.用户和发布的出租信息 D.士兵和班长 6.下面是某系统中的两个实体类,依此可以得知(b )。 public class Wage{ //月工资实体类 private Long wid; private String empName; //雇员姓名 private String month; //月份 //Getter & Setter …… } public class WageItem{ //工资项 private Wage wage; private Long iid; private String itemName; //项目名称,如基本工资、职位津贴等private String amount; //数额 //Getter & Setter …… } A.Wage 和WageItem 间存在单向一对多的关联 B.Wage 和WageItem 间存在单向多对一的关联 C.Wage 和WageItem间存在双向一对多的关联 D.Wage 和WageItem间存在双向多对一的关联 7.两实体类代码如下: public class Wage{ //月工资实体类 private Long wid; private String empName; //雇员姓名 private String month; //月份 //Getter & Setter …… } public class WageItem{ //工资项 private Wage wage;

J2EE期末复习(含答案)

1、ORM 有什么好处?A A).能进行关系对象的映射 B).具有控制器功能 C).能在服务器端保存客户端状态 D).向DTO传递数据 2、在使用property标签时,如果要显示标签的代码,需要设置下面哪个属性的属性值? C A).default B).value C).escape D).id 3、以下哪一种检索策略利用了外连结查询?C A).立即检索 B).延迟检索 C).迫切左外连结检索 D).迫切右外连结检索 4、如果你不能确定你要寻找的对象的持久化标识符,那么你需要使用查询,使用Session 的什么方法? A A).createQuery() B).query() C).queryAll() D).queryObject() 5、HQL查询语句from Cat as cat,不仅仅返回Cat的实例,而且还返回____的实例。B A).Cat 父类 B).Cat 子类 C).Cat 实现接口 D).Cat 兄弟类 6、下面哪些子句不支持算数表达式?C A).compute by 和order by B).compute by 和insert by C).order by 和group by D).insert by 和group by 7、使用Hibernate 的QBC 查询,要使用SQL 中的类似select count(*) from tablename 方法求出记录数,必须使用哪一个类?B A).Restrictions B).Projections C).Criteria D).Criteron 8、Struts2中默认的主题是哪一种?B A).simple B).xhtml C).css_xhtml D).ajax

2019最新Java面试题,常见面试题及答案汇总

ava最新常见面试题+ 答案汇总 1、面试题模块汇总 面试题包括以下十九个模块:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。如下图所示: 可能对于初学者不需要后面的框架和JVM 模块的知识,读者朋友们可根据自己的情况,选择对应的模块进行阅读。 适宜阅读人群 需要面试的初/中/高级java 程序员 想要查漏补缺的人 想要不断完善和扩充自己java 技术栈的人 java 面试官 具体面试题 下面一起来看208 道面试题,具体的内容。 一、Java 基础 1.JDK 和JRE 有什么区别? 2.== 和equals 的区别是什么? 3.两个对象的hashCode()相同,则equals()也一定为true,对吗? 4.final 在java 中有什么作用? 5.java 中的Math.round(-1.5) 等于多少? 6.String 属于基础的数据类型吗? 7.java 中操作字符串都有哪些类?它们之间有什么区别? 8.String str="i"与String str=new String(“i”)一样吗? 9.如何将字符串反转? 10.String 类的常用方法都有那些? 11.抽象类必须要有抽象方法吗? 12.普通类和抽象类有哪些区别? 13.抽象类能使用final 修饰吗?

14.接口和抽象类有什么区别? 15.java 中IO 流分为几种? 16.BIO、NIO、AIO 有什么区别? 17.Files的常用方法都有哪些? 二、容器 18.java 容器都有哪些? 19.Collection 和Collections 有什么区别? 20.List、Set、Map 之间的区别是什么? 21.HashMap 和Hashtable 有什么区别? 22.如何决定使用HashMap 还是TreeMap? 23.说一下HashMap 的实现原理? 24.说一下HashSet 的实现原理? 25.ArrayList 和LinkedList 的区别是什么? 26.如何实现数组和List 之间的转换? 27.ArrayList 和Vector 的区别是什么? 28.Array 和ArrayList 有何区别? 29.在Queue 中poll()和remove()有什么区别? 30.哪些集合类是线程安全的? 31.迭代器Iterator 是什么? 32.Iterator 怎么使用?有什么特点? 33.Iterator 和ListIterator 有什么区别? 34.怎么确保一个集合不能被修改?

hibernate数据修改后不能及时更新 -

主要表现在新增、修改数据后,在数据列表中不能显示刚插入数据的关联对象的信息(新增插入或修改的数据主数据能显示,只有关联的数据不能显示),但刷新后能显示,再刷新可能又显示不出来了。随机的能显示或不能显示。搞不懂。 当你手动修改了数据库,Hibernate缓存中的数据就有可能是过期的。为了保证Hibernate与数据库一致,一般的 做法是在手动修改数据库之后,使用Hibernate查询数据之前,清空缓存。也就是说,你应该在执行查询前,调用 session.clear(). 参考:hibernate缓存管理 1.缓存概述 缓存(cache)在java应用程序中是一组内存中的集合示例,它保存着永久性存储源(如硬盘上的文件或数据库)中数据的备份,它的读写速度比读写硬盘的速度快。应用程序在运行时直接读写缓存中的数据,只在某些特定时刻按照缓存中的数据来同步更新数据存储源。如果缓存中存放的数据量非常大,也会用硬盘作为缓存的物理介质 缓存的作用就是降低应用程序直接读写永久性数据存储源的频率,从而增强应用的运行性能 缓存的实现不仅需要作为物理介质的硬件(内存),同时还需要用于管理缓存的并发访问和过期等策略的软件 2.缓存范围分类 缓存的范围决定了缓存的声明周期以及可以被谁访问。总共分三类 1)事务范围 事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象形式.缓存的生命周期依赖于事务的生命周期,只有当事务结束时,缓存的生命周期才会结束.事务范围的缓存使用内存作为存储介质,一级缓存就属于事务范围. 2)应用范围(也叫进程范围) 应用程序的缓存可以被应用范围内的所有事务共享访问.缓存的生命周期依赖于应用的生命周期,只有当应用结束时,缓存的生命周期才会结束.应用范围的缓存可以使用内存或硬盘作为存储介质,

Java三大框架(ssh)总结

Hibernate框架 第一章数据结构 1.1认识数据结构 数据:是信息的载体,是能够被计算机识别、存储、计算的符号集合是计算机处理的对象的总称; 数据元素:也称为结点,是组成数据的基本单位; 数据项:是数据的最小单位; 数据对象:是具有相同特征的数据元素的集合,它是数据的子集; 数据结构:计算机存储、组织数据的方式; ●逻辑结构:指从逻辑关系上描述数据,与数据的存储无关,且独立于语言; ?线性结构:有且仅有一个开始结点和一个终端结点,所有结点最多只有一个前驱 结点和一个直接后继结点; ?非线性结构:指一个结点可能有多个直接前驱和直接后继结点。 ●存储结构:指数据元素及其关系在计算机存储时如何表示,依赖于语言; ●数据运算:通茶昂贵定义在数据的逻辑结构上。 1.2算法 是为求解一个问题需要遵循的,被清晰的制定的简单指令的集合;正确的算法有如下特点: ●用待处理问题的相关信息作为输入数据 ●对一个既定的合法输入,多次执行同一算法,总返回同一个结果(随机算法除外) ●算法中的指令是可行的,即每个指令都可以实现 ●算法中指令的数量是有限的 ●算法执行完毕后,能够输出正确的数据集合 1.3算法分析 目的在于选择合适的算法,算法分析是从复杂度来考虑的。复杂度:衡量一个算法好坏的重要手段; ●时间复杂度:以算法执行时间长短来衡量 ●空间复杂度:以算法执行占用的存储空间来衡量

第二章算法 第三章设计模式 3.1面向对象设计原则 单一职责原则:要求每个对象应该只有一种责任; 开闭原则:设计程序时对扩展开放,对修改关闭; 里氏替换原则:任何情况下,子类替换父类,不会影响程序运行; 依赖倒置原则:提倡高层不依赖底层,二者都依赖抽象; 接口隔离原则:把多个功能分开声明,不强迫客户实现不需要的功能; 迪米特原则:最少只是原则尽可能的降低访问级别; 组合/聚合复用原则:尽量不用继承达到复用类的目的,而是使用组合和聚合。 3.2设计模式分类 创建型模式:如何创建对象以及何时创建对象,工厂模式,单例模式 结构型模式:对象该如何组织以及采用什么样的结构更合理 行为型模式:规定了各个对象应该具备的职责以及对象间的通信模式 3.3什么是框架 应用程序骨架;框架技术的优势在于: ●不用再考虑公共问题,框架已经帮我们做好了 ●可以专心在业务逻辑上,保证核心业务逻辑的开发质量 ●结构统一,便于学习、维护 ●框架集成的前人的经验有助于写出稳健、性能优良并且结构优良的高质量程序 3.4主流框架 3.4.1 Struts框架 最早的Java开源框架之一,定义了通用的Controller(控制器),通过配置文件(一般是struts-config.xml)隔离了Model(模型)和View(视图),以Action的概念对用户请求进行了封装,是代码更清晰易读。 3.4.2 Struts2框架 新的框架特性: ●从逻辑中分离出横切关注点的拦截器 ●减少或者消除配置文件 ●贯穿整个框架的强大表达式语言 ●支持可变更和可重用的基于MVC模式的标签API

hibernate如何实现延迟加载

hibernate 如何实现延迟加载 延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。下面我们就分别介绍这些种类的延迟加载的细节。 A、实体对象的延迟加载: 如果想对实体对象使用延迟加载,必须要在实体的映射配置文件中进行相应的配置,如下所示: …… 通过将class的lazy属性设置为true,来开启实体的延迟加载特性。如果我们运行下面的代码: User user=(User)session.load(User.class,”1”);(1) System.out.println(user.getName());(2) 当运行到(1)处时,Hibernate并没有发起对数据的查询,如果我们此时

通过一些调试工具(比如JBuilder2005的Debug工具),观察此时user对象的内存快照,我们会惊奇的发现,此时返回的可能是User$EnhancerByCGLIB$$bede8986类型的对象,而且其属性为null,这是怎么回事?还记得前面我曾讲过session.load()方法,会返回实体对象的代理类对象,这里所返回的对象类型就是User对象的代理类对象。在Hibernate中通过使用CGLIB,来实现动态构造一个目标对象的代理类对象,并且在代理类对象中包含目标对象的所有属性和方法,而且所有属性均被赋值为null。通过调试器显示的内存快照,我们可以看出此时真正的User对象,是包含在代理对象的CGLIB$CALBACK_0.target属性中,当代码运行到(2)处时,此时调用user.getName()方法,这时通过CGLIB赋予的回调机制,实际上调用CGLIB$CALBACK_0.getName()方法,当调用该方法时,Hibernate会首先检查CGLIB$CALBACK_0.target属性是否为null,如果不为空,则调用目标对象的getName方法,如果为空,则会发起数据库查询,生成类似这样的SQL语句:select * from user where id=’1’;来查询数据,并构造目标对象,并且将它赋值到CGLIB$CALBACK_0.target属性中。 这样,通过一个中间代理对象,Hibernate实现了实体的延迟加载,只有当用户真正发起获得实体对象属性的动作时,才真正会发起数据库查询操作。所以实体的延迟加载是用通过中间代理类完成的,所以只有session.load()方法才会利用实体延迟加载,因为只有session.load()方法才会返回实体类的代理类对象。

hibernate框架必问的面试题

108.为什么要使用 hibernate? hibernate 是对 jdbc 的封装,大大简化了数据访问层的繁琐的重复性代码。 hibernate 是一个优秀的 ORM 实现,很多程度上简化了 DAO 层的编码功能。 可以很方便的进行数据库的移植工作。 提供了缓存机制,是程序执行更改的高效。 109.什么是 ORM 框架? ORM(Object Relation Mapping)对象关系映射,是把数据库中的关系数据映射成为程序中的对象。 使用 ORM 的优点:提高了开发效率降低了开发成本、开发更简单更对象化、可移植更强。 115.hibernate 中如何在控制台查看打印的 SQL 语句? 在 Config 里面把 hibernate. show_SQL 设置为 true 就可以。但不建议开启,开启之后会降低程序的运行效率。 116.hibernate 有几种查询方式? 三种:hql、原生 SQL、条件查询 Criteria。 117.hibernate 实体类可以被定义为 final 吗? 实体类可以定义为 final 类,但这样的话就不能使用 hibernate 代理模式下的延迟关联提供性能了,所以不建议定义实体类为 final。 118.在 hibernate 中使用 Integer 和 int 做映射有什么区别? Integer 类型为对象,它的值允许为 null,而 int 属于基础数据类型,值不能为 null。 119.hibernate 是如何工作的? 读取并解析配置文件。 读取并解析映射文件,创建 SessionFactory。 打开 Session。 创建事务。 进行持久化操作。 提交事务。 关闭 Session。 关闭 SessionFactory。 120.get()和 load()的区别? 数据查询时,没有 OID 指定的对象,get() 返回 null;load() 返回一个代理对象。 load()支持延迟加载;get() 不支持延迟加载。

hibernate练习题

1、下面创建Criteria对象得语句中正确得就是 单选 A、Criteria c = query、createCriteria(); B、Criteria c = query、addCriteria(); C、Criteria c = session、createCriteria(); D、Criteria c = session、createCriteria(User、class); 2、Query对象执行查询结论正确得就是 多选 A、list()方法返回结果为List对象,数据总量为0到多条 B、uniqueResut()方法返回结果为对象或对象数组,数据总量为0到1条数据 C、HQL:select userName from UserModel可以使用list()方法进行查询结果得获取 D、HQL:select userName from UserModel可以使用uniqueResut()方法进行查询结果得获取3Hibernate实体对象制作规范不包含下列哪条规则 单选 A、声明无参公共得构造方法 B、提供用于作为OID得标识属性 C、为所有属性提供getter与setter方法 D、声明为最终类(final修饰) 4在HQL语句得参数查询中,执行以下代码,下列选项能够为参数正确赋值得操作就是Query query = s、createQuery("from Customer o where o、name=?"); 单选 A、query、setParameter(1, "Tom"); B、query、setParameter(0, "Tom"); C、query、setString(0,Tom); D、query、setInteger (0,Tom); 5有关Hibernate瞬时对象状态说法错误得就是 多选 A、瞬时状态得对象具有OID,与Session对象关联 B、瞬时状态得对象具有OID,不与Session对象关联 C、瞬时状态得对象不具有OID,与Session对象关联 D、瞬时状态得对象不具有OID,不与Session对象关联 6有关QBC查询短语,下列说法正确得 多选 A、Restrictions、between表示范围比对 B、Restrictions、eq表示等比对 C、Restrictions、le表示小于等于比对 D、Restrictions、ge表示大于等于比对 7下列操作对一级缓存得影响描述错误得就是 单选 A、执行delete操作时,如果对象不具有OID,将抛出异常 B、执行update操作时,如果对象不具有OID,将抛出异常 C、执行update操作时,如果一级缓存中已经存在有相同OID数据,将抛出异常 D、执行merge操作时,如果一级缓存中已经存在有相同OID数据,将抛出异常 8下列哪项不就是用于配置数据库连接得配置

检索策略

文献检索策略 作者:佚名文章来源:转载点击数:9530 更新时间:2008/4/2 16:35:11 热★★★ 1、检索策略的概念 检索策略是为实现检索目标而制订的全盘计划或方案,指导整个检索过程,因此检索策略几乎包括了全部检索有关的基本知识的应用。 检索策略,就是在分析课题内容具有哪些概念单元的基础上,确定检索系统、检索文档、检索途径和检索词,并科学安排各检索词之间的位置关系和逻辑关系以及查找步骤等。检索策略考虑得是否周全,直接影响文献的查全率和查准率。 2、制定检索策略的步骤 您脑海中有一个需要找寻资料的课题,明确检索目的。 将与课题相关概念陈列开来,进行分析,然后建立检索命题。 寻找有关资料,如专书、期刊论文等并评估检索结果所得资料是否和课题相关。 查找检索所得资料 利用资料后所列的参考书目查寻更多的资料。 评估所找寻到的资料 若满意所找寻到的资料,使用查获得的资料。若所得资料和课题无关,重新将与课题相关的概念陈列开来,并建立检索关键词。

3、检索策略的制定 一、制定检索策略的基础是弄清信息需要和检索目的。如何对信息需求进行正确的分析呢?不妨从信息需求的形式和内容两方面来分析。有关信息的形式需求要明确的问题有: ①明确检索目的。检索是为了申报成果,还是为了了解学科的最新进展等等,据此以制定出符合查全或查准要求的检索策略。 ②明确所需的文献量。规定所需文献数量的上限,对以后确定检索策略和控制检索费用是一个很重要的参数;同时还需对检索课题可能有的相关文献量做出估计。 ③明确所需文献的语种、年代范围、类型、作者或其他外表特征,这对限定检索范围也很重要。 关于信息的内容需求要明确的主要问题有: ①明确检索课题内容涉及的主要学科范围,这对以后选择合适的数据库很重要。 ②分析检索课题的主要内容,用自然语言来表达这些内容要求,这是联机检索中较为重要的环节。 二、在明确检索目的基础上,对检索课题进行概念分析,如果课题属单一概念就用单个检索词表达,若课题概念复杂,就把复杂概念分解为若于个概念单元,再用逻辑运算符把表达概念单元的检索词组配起来。将概念单元转换为检索词时侯,应该尽量选用规范化词。检索新课题、边缘学科或是比较含糊的概念时,应特别小心,因为这些词往往没有收入系统,这里应从专业范畴出发选用本学科内具有检索意义的关键词即自由词,不然就会带来误检或漏检。 以下几点意见希望能帮助您更妥善地处理您的研究课题: ①、把您的研究课题转换成一个问题。如:“老人问题”谁应该负起照顾老人的责任:家庭或政府?把研究课题分析成几个重要的概念“老人”、“照顾”、“政府”、“家庭”。②、把和概念的同义词陈列开来。在做这项工作的时候,可参考辞典、词语汇编和图书馆主题词表。 ③、把概念放宽,这样可给予您更多检索词组。尤其是当您在利用检索概念后找不到或仅找

相关文档
最新文档