Hibernate练习题.docx

上传人:牧羊曲112 文档编号:3157929 上传时间:2023-03-11 格式:DOCX 页数:11 大小:42.44KB
返回 下载 相关 举报
Hibernate练习题.docx_第1页
第1页 / 共11页
Hibernate练习题.docx_第2页
第2页 / 共11页
Hibernate练习题.docx_第3页
第3页 / 共11页
Hibernate练习题.docx_第4页
第4页 / 共11页
Hibernate练习题.docx_第5页
第5页 / 共11页
亲,该文档总共11页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《Hibernate练习题.docx》由会员分享,可在线阅读,更多相关《Hibernate练习题.docx(11页珍藏版)》请在三一办公上搜索。

1、Hibernate练习题Hibernate练习题 1. 一般情况下,关系数据模型与对象模型之间有哪些匹配关系ABC A)表对应类 B)记录对应对象 C)表的字段对应类的属性 D)表之间的参考关系对应类之间的依赖关系 2.试述load和get的区别。 1.从返回结果上对比: load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常 get方法检索不到的话会返回null 2.从检索执行机制上对比: get方法和find方法都是直接从数据库中检索 而load方法的执行则比较复杂首先查找session的persistent Context中是否有缓存

2、,如果有则直接返回 如果没有则判断是否是lazy,如果不是直接访问数据库检索,查到记录返回,查不到抛出异常 如果是lazy则需要建立代理对象,对象的initialized属性为false,target属性为null 在访问获得的代理对象的属性时,检索数据库,如果找到记录则把该记录的对象复制到代理对象的target上,并将initialized=true,如果找不到就抛出异常。 hibernate对于 load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方 法,hibernate一定要获取到真实的数据,否则返回null。 3

3、.简述使用Hibernate完成持3久化操作的3个准备和7个步骤。 1.创建Congfigure对象。读取并解析配置文件(相当于使用数据源(DataSource)获取连接前读取DataSource的配置文件):Configuration conf=new Configuration.configure; 2.读取并解析映射信息,创建SessionFactory(相当于创建了数据源(DataSource)对象),它是产生Session对象实例的工厂,它是唯一的。:SessionFactory sf=conf.buildSessionFactory; 3.创建Session对象,打开session

4、(相当于JDBC获得数据库的连接):Session session=sf.openSession; 4.开始一个事务:tx=sessionl.beginTransaction; 5.持久化操作:session.save(user); 6.结束事务:mit; 7.关闭session,释放数据库的链接:session.close; 三个准备如下: 1.需要的jar包 2.Hibernate配置文件 3.实体类和映射文件 注:于JDBC类似,持久化操作要放在try语句块中,如果发生异常则将事物回滚。关闭session的语句放在finally语句块中。 4. 在持久化层,对象分为哪些状态?ACD A)

5、临时状态 B)独立状态 C)游离状态 D)持久化状态 5. 事务隔离级别是由谁实现的?C A)Java应用程序 B)Hibernate C)数据库系统 D)JDBC驱动程序 6.假设对Customer类的orders集合采用延迟检索策略,编译或运行以下程序,会出现什么情况C Session session=sessionFactory.openSession; tx = session.beginTransaction; Customer customer=(Customer)session.get(Customer.class,new Long(1); mit; session.close;

6、 Iterator orderIterator=customer.getOrders.iterator; A)编译出错 B)编译通过,并正常运行 C)编译通过,但运行时抛出异常 7. 以下程序代码对Customer的name属性修改了两次: tx = session.beginTransaction; Customer customer=(Customer)session.load(Customer.class, new Long(1); customer.setName(Jack); customer.setName(Mike); mit; 执行以上程序,Hibernate需要向数据库提交几

7、条update语句?B A)0 B)1 C)2 D)3 8. 以下关于SessionFactory的说法哪些正确?BC A)对于每个数据库事务,应该创建一个SessionFactory对象 B)一个SessionFactory对象对应一个数据库存储源。 C)SessionFactory是重量级的对象,不应该随意创建。如果系统中只有一个数据库存储源,只需要创建一个。 D)SessionFactory的load方法用于加载持久化对象 9. Customer类中有一个Set类型的orders属性,用来存放Order订单对象,在Customer.hbm.xml文件中,用哪个元素映射orders属性?A

8、 A) B) C) D) 10. 元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,casecade属性应该取什么值?D A)none B)save C)delete D)save-update 11.试述Hibernate有哪些检索方式? HQL检索方式 QBC检索方式 本地SQL检索方式 12.对于以下程序,Customer对象在第几行变为游离状态?F Customer customer=new Customer; /line1 customer.setName(Tom); /line2 Session session1=sessionFactory.openS

9、ession; /line3 Transaction tx1 = session1.beginTransaction; /line4 session1.save(customer); /line4 mit; /line5 session1.close; /line6 A) line1 B)line2 C)line3 D)line4 E)line5 F)line6 13. 如何优化Hibernate查询性能? 1 )lazy=true, hibernate3开始已经默认是lazy=true了;lazy=true时不会立刻查询关联对象,只有当需要关联对象时才会发生查询动作。 2)二级缓存, 在对象

10、更新,删除,添加相对于查询要少得多时, 二级缓存的应用将不怕n +1 问题,因为即使第一次查询很慢,之后直接缓存命中也是很快的。 14. 以下程序的打印结果是什么? C tx = session.beginTransaction; Customer c1=(Customer)session.load(Customer.class,new Long(1); Customer c2=(Customer)session.load(Customer.class,new Long(1); System.out.println(c1=c2); mit; session.close; A)运行出错,抛出异常

11、 B)打印false C)打印true D)运行通过,但什么都不显示 15. 下面关于hibernate核心接口说明错误的是? B A)Configuration 接口:配置Hibernate,根据其启动hibernate,创建SessionFactory 对象; B)SessionFactory 接口:负责保存、更新、删除、加载和查询对象,是线程不安全的,避免多个线程共享同一个session,是轻量级、一级缓存; C)Query 和Criteria 接口:执行数据库的查询; D)Transaction 接口:管理事务。 16. 下面代码的执行效果是。 String hql = from Tb

12、lStudent s order by s.score desc; Query query = session.createQuery(hql); query.setFirstResult(0); query.setMaxRexults(5) return query.list; A)返回分数最高的5个学生 B)返回分数最高的6个学生 C)返回分数最低的5个学生 D)返回分数最低的6个学生 17. 下面不是Hibernate映射文件中包含的内容。 A)数据库连接信息 B)Hibernate属性参数 C)主键生成策略 D)属性数据类型 18. 下面是某系统中的两个实体类,依次可以得知。 publ

13、ic 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间存在单向多

14、对一的关联 C)Wage和WageItem间存在双向一对多的关联 D)Wage和WageItem间存在双向多对一的关联 20. 下面程序执行后没有报错,但数据总保存不到数据库,最可能的原因是。 public static void main(String args) SessionFactory sf = new Configuration.configure.buildSessionFactory; Session session = sf.openSession; Medal medal=new Medal; medal.setOwner(Lily); medal.setSport(Tab

15、le Tennis-Women s Singles); medal.setType(Glod Medal); session.save(medal); session.close; A)没有在配置文件中包含对映射文件的声明 B)配置文件配置有误 C)映射文件配置有误 D)没有对持久化操作捕捉异常 E)没有开启事务 21. 下面不属于关系-对象映射的映射信息。 A).程序包名到数据库库名的映射 B).程序类名到数据库表名的映射 C).实体属性名到数据库表字段的映射 D).实体属性类型到数据库表字段类型的映射 22. 对下面代码中存在的错误,说法不正确的是。 String hql = from T

16、blUser u where u.status = status;/ Query query = session.createQuery;/ query.setNamedParameter(:status, );/ return query.executeQuery(hql);/ A)第一行中的命名参数status应该是:status B)第二行createQuery函数应该传入hql作为参数 C)第三行命名参数名称:status应该是status D)第四行应该是return query.list(hql); 23.Hibernate继承映射有哪几种方式?试对几种方式进行比较。 比较方面 每

17、个具体类一每个分层结构每个子类一张表 张表 一张表 建立关系模型每个具体类对描述一个继承每个子类使用一张表,但这些原则 应一张表,有多关系只用一张子类所对应的表都关联到基少具体类就需表,也就是说子类所对应的表中 要建立多少个类所使用的表独立的表 与父类相同 关系模型的优这种设计方式缺点有二:首先这种设计方式完全符合关系缺点 符合关系模型表中引入的区模型的设计原则,且不存在冗的设计原则,但分子类的字段,余 有表中存在重也就是包括了复字段的问题 描述其他字段的字段。其次,如果某个子类的某个属性不能为空,那么在数据库一级不能设置该字段not null(非空) 可维护性 如果需要对基维护起来方便,维护

18、起来比较方便,对每个类类进行修改,则只需要修改一的修改只需要修改其所对应需要对基类以个表 及该类的子类所对应的所有表都进行修改 灵活性 映射的灵活性灵活性差,表中灵活性很好,完全是参照对象很大,子类可以冗余字段会随继承的方式进行配置 包括基类属性着子类的增多在内的每一个而越来越多 属性进行单独配置 查询性能 对于子类的查在任何情况下,对于父类的查询需要使用左询只需要访问都只需处理一外链接,对于子类查询需要使单独的表,对父个表 类查询怎需要检索所有的表 维护性能 对于单个对象对于单个对象对于子类的持久话至少要处持久话操作只的持久话操作理两个表 需要处理一个只需要处理一表 的表 用内链接 个表 2

19、4.什么是Hibernate的并发机制?怎么去处理并发问题? Hibernate并发机制: a、Hibernate的Session对象是非线程安全的,对于单个请求,单个会话,单个的工作单元(即单个事务,单个线程),它通常只使用一次, 然后就丢弃。 如果一个Session 实例允许共享的话,那些支持并发运行的,例如Http request,session beans将会导致出现资源争用。 如果在Http Session中有hibernate的Session的话,就可能会出现同步访问Http Session。只要用户足够快的点击浏览器的“刷新”, 就会导致两个并发运行的线程使用同一个Session

20、。 b、多个事务并发访问同一块资源,可能会引发第一类丢失更新,脏读,幻读,不可重复读,第二类丢失更新一系列的问题。 解决方案:设置事务隔离级别。 Serializable:串行化。隔离级别最高 Repeatable Read:可重复读 Read Committed:已提交数据读 Read Uncommitted:未提交数据读。隔离级别最差 设置锁:乐观锁和悲观锁。 乐观锁:使用版本号或时间戳来检测更新丢失,在的映射中设置 optimistic-lock=”all”可以在没有版本或者时间戳属性映射的情况下实现 版本检查,此时Hibernate将比较一行记录的每个字段的状态 行级悲观锁:Hiber

21、nate总是使用数据库的锁定机制,从不在内存中锁定对象!只要为JDBC连接指定一下隔 离级别,然后让数据库去搞定一切就够了。类LockMode 定义了Hibernate所需的不同的锁定级别:LockMode.UPGRADE,LockMode.UPGRADE_NOWAIT,LockMode.READ; 25、在持久化层,对象分为哪些状态?如何转换? (1) 临时状态:刚刚用new语句创建,还没有被持久化,不处于Session的缓存中。处于临时状态的Java对象被称为临时对象。 (2) 持久化状态:已经被持久化,加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。 (3)

22、游离状态:已经被持久化,但不再处于Session的缓存中。处于游离状态的Java对象被称为游离对象。 26、试述Hibernate Session接口中load与get、persist与save方法的区别。 load与get的区别 load加载的是对象的代理类,将目标对象放在自己的target属性之中,并且拥有target所有的属性,但是值为NULL,当需要数据时 会去向target索取相应的属性值,如果target只中的值为NULL则执行数据库查询获取数据,所以在执行load时候并无看到控制台 有sql语句打出,知道访问对象属性时候控制台才有相应的sql语句输出. get就是即时加载,当下立

23、刻执行获取实体类 persist,save的区别 如果使用save后不开启事务提交,事务则会回滚,但是有执行insert语句.所以数据库无发生改变,控制台却打印出了insert语句 然而persist如果不开启事务insert是不会执行的,这就是他们之间最主要的区别 27、试述Query接口list与iterate区别。 list方法返回的是结果集的list集合,iterate返回的是iterator迭代器。 list方法查询所有记录只发送一条sql语句,select * from 表名 iterate方法查询所有记录的话,先查询到满足条件的所有记录id,并不立即查询所有结果,当我们有用到某个记录的话,他才查询。如果显示所有记录的话需要n+1条sql语句。第一条查id,接下去根据id,一条一条查询,所以是n+1条。 list方法缓存中有记录了,他还是会发生sql语句到数据库中查询。 iterate方法缓存中有记录了,他只发送一条查符合条件的id的sql语句。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号