zoukankan      html  css  js  c++  java
  • hibernate内部测试题(附赠答案)

    一、选择题(共25题,每题2.5分,选择一项或多项,漏选错选不得分)

    1.在Hibernate中,以下关于主键生成器说法错误的是( )。

    Aincrement可以用于类型为longshortbyte的主键

    Bidentity用于如SQL ServerDB2MySQL等支持标识列的数据库

    Csequence用于如OracleSQL Server等支持序列的数据库

    DnativeHibernate根据底层数据库自行判断采用何种主键生成策略,是由使用的数据库生成主键的值

    2.在Hibernate中,关于脏检查和刷新缓存说法正确的是( )。

    A.当事务提交时,会发生脏检查

    BSessionflush( )方法是刷新缓存的方法

    C.在执行Sessioncommit( )方法之前不会调用Sessionflush( )方法

    D.编写代码时,调用commit( )方法之前要调用flush( )方法

    3.使用HQL查询所有部门信息,以下正确的是( )。

    Afrom Dept

    Bselect * from cn.jbit.demo.entity.Dept

    Cselect Dept from cn.jbit.demo.entity.Dept d

    Dselect d from Dept d

    4.关于Query接口的list( )iterate( )方法,说法正确的是( )。

    A.执行list( )方法,查询所有符合条件的记录

    B.执行iterate( )方法,查询所有符合条件的记录

    C.执行list( )方法,查询出所有符合条件的主键值

    D.执行iterate ( )方法,查询出所有符合条件的主键值

    5.在HQL中,关于Query接口绑定参数的方法,说法正确的是( )。

    AsetParameter( )方法用于绑定任意类型的参数

    BsetParameter( )有重载的方法

    CsetProperties( )有重载的方法

    DsetProperties( )方法用于绑定命名参数

    6.在Hibernate中,关于以下映射配置,说法错误的是( )。

    <hibernate-mapping>

        <class name="cn.jbit.hibernatedemo.entity.Emp" table="EMP" schema="scott">

            <id name="empNo" column="EMPNO" type="java.lang.Integer">

                <generator class="assigned"/>

            </id>

            <property name="salary" type="java.lang.Double" column="SAL"/>

            <property name="hireDate" type="java.util.Date"/>

            <many-to-one

                name="dept"

                column="DEPTNO"

                class="cn.jbit.hibernatedemo.entity.Dept"

            />

        </class>

    </hibernate-mapping>

    A.此配置信息描述了cn.jbit.hibernatedemo.entity.Emp类和EMP表的映射

    B.描述的是scott用户的EMP

    C<many-to-one>标签中的name属性值deptcn.jbit.hibernatedemo.entity.Emp类的属性名

    D<many-to-one>标签中的column属性值DEPTNOdept表的主键名

    7.在Hibernate映射文件中,关于inverse属性说法正确的是( )。

    Ainverse属性有两个值:truefalse

    B<many-to-one>标签有inverse属性

    C<set>标签有inverse属性

    Dinverse属性用于指定维护关联关系的那一方

    8.在Hibernate映射文件中,关于延迟加载配置说法错误的是( )

    A<class>标签中lazy属性可选值:truefalse

    B<set>标签中lazy属性可选值:trueproxyno-proxy

    C< set>标签中lazy属性可选值:trueextrafalse

    D<many-to-one>标签中lazy属性可选值:proxytruefalse 

    9.在Hibernate映射文件中,关于<component>标签说法正确的是( )。

    A<component>标签用来映射组件类

    B<component>标签通过<parent>指定组件类所属的整体类

    C<component>标签通过<property>指定组件类的属性

    D<component>标签有idnameclass属性

    10MyBatis指定配置文件的根元素使用的是( )。

    A<sqlMapConfig>

    B<configuration>

    C<setting>

    D<environments>

    11.在MyBatis中,ExecutorType的值包括( )。

    AExecutorType.SIMPLE

    BExecutorType.BATCH

    CExecutorType.EXECUTE

    DExecutorType.REUSE

    12.关于Hibernate缓存说法错误的是( )。

    AHibernate缓存一般分为三类:一级缓存、二级缓存和查询缓存

    BSessionevict( )方法用于从缓存中清除指定的持久化对象

    CSessionclear( )方法用于刷新缓存

    DSessionflush( )方法用于从缓存中清除所有持久化对象

    13.关于HQL的连接查询,说法错误的是( )。

    Ainner join join用于内连接

    Binner join fetchjoin fetch用于迫切内连接

    Cleft outer join fetch left join fetch用于迫切左外连接

    Dright outer join fetch right join fetch用于迫切右外连接

    14.关于Hibernate批量处理数据说法正确的是( )。

    A.使用HQL进行批量操作,Hibernate不支持批量插入

    B.使用JDBC API进行批量操作,SQL语句中涉及的数据会被加载到Session缓存,占用内存空间

    C.使用Session进行批量操作,数据会被加载到Session缓存,需注意刷新并清空缓存

    D.使用Session进行批量操作,适用于需要通过代码处理的复杂的业务逻辑场景

    15.关于HQL的聚合函数使用,说法正确的是( )。

    Aselect count(*) from Dept d用于统计部门个数

    Bselect sum(e.salary) from Emp e用于汇总员工工资总额

    Cselect max(e.hiredate) from Emp e用于找到最新入职的员工的入职时间

    Dselect min(e.hiredate) from Emp e用于找到最早入职的员工的入职时间

    16关于HQL子查询中,说法错误的是( )。

    Asize( )size用于获取集合中元素的数目

    Belements( )用于获取集合中的所有元素

    Cany关键字用于子查询语句返回所有记录

    Din关键字与“=any”意思相同

    17关于原生SQL查询和命名查询,说法正确的是( )。

    A执行原生SQL,需使用SQLQuery对象

    BSQLQuery是一个接口,继承了Query接口

    CHibernate支持在映射文件中定义字符串形式的查询语句,这样的语句是命名查询语句

    D.命名查询语句只能是HQL语句,不能是SQL语句

    18 Hibernate中,关于映射Oracle中的BLOBCLOB类型的方法,说法正确的是( )。

    ACLOB类型只能映射为java.lang.String

    BBLOB类型可以映射为java.sql.Blob

    CBLOB类型可以映射为byte[]

    DCLOB类型可以映射为java.lang.Stringjava.sql.Clob

    19.在Hibernate中,关于Criteria运算方法说法错误的是 

    ARestrictions.ge( )方法等同于HQL运算符 >=

    BRestrictions.like("empName","s",MatchMode.START)方法用于查找姓名以s开头的员工

    CRestrictions.disjunction( )方法用于指定多个逻辑与

    DRestrictions.in( )方法只能用于数组

    20Hibernate中,关于注解说法正确的是( )

    A@Id用于声明持久化类的唯一标识,对应于数据表中的主键

    B@Cloumn用于将属性映射到列

    C@Transient用于忽略该属性,需要持久化到数据库

    D@GeneratedValue用于定义主键值的生成策略

    21.下列关于同义词的说法,选项正确的是( )。

    A.只能为表创建同义词,不能为视图创建同义词

    B.同义词只能用于引用其他用户创建的表

    C.公有同义词和私有同义词对同一个表可以同名

    D.使用Drop Synonym语句删除同义词的同时,同义词引用的表也无效

    22.评估CREATE TABLE 语句:

    CREATE TABLE products

    (

    product_id NUMBER(6) CONSTRAINT prod_id_pk PRIMARY KEY,

    product_name VARCHAR2(15)

    )

    下列关于prod_id_pk选项正确的是( )。

    A.可以被创建,但需要唯一索引用手工创建

    B.可以被创建并且会自动创建唯一索引

    C.可以被创建并且会自动创建非唯一索引

    D.可以被创建但不可以使用,因为没有指定索引

    23.下列创建序列的SQL语句:

    CREATE SEQUENCE seq1

    START WITH 100

    INCREMENT BY 10

    MINVALUE 1

    MAXVALUE 200

    CYCLE

    NOCACHE;

    序列seq1的生成的值已经到最大值200,再执行下列语句:

    SELECT seq1.nextval FROM dual;

    下列显式正确值的选项是( )。

    A1

    B10

    C100

    D.报错

    24A_oeA_hr是数据库中的2个用户,A_oe下有一个表Orders,执行下列语句如下:

    CREATE ROLE r1;

    GRNAT SELECT,INSERT ON A_oe.orders to r1;

    GRANT r1 to A_hr;

    GRANT SELECT ON A_oe.orders To A_hr;

    REVOKE SELECT ON A_oe.orders FROM A_hr;

    执行上面语句后结果正确的是( )。

    AA_hr能够查询A_oe.orders

    BA_hr不能够查询A_oe.orders

    CREVOKE语句将撤销A_hrSELECT权限同时也从r1角色撤销SELECT权限

    DREVOKE语句将报错,因为SELECT权限已经被r1角色授予

    25.对于视图,下列语句正确的是( )。

    A.有列别名的视图不能被修改

    B.一个复杂的视图定义中使用子查询不能包含聚合(分组)函数和连接

    C.如果一个视图定义中包含DISTINCT关键字,则不能够通过视图进行删除

    D.创建视图语法中OR REPLACE 选项被使用,目的是在没有删除视图的情况下修改已

    在的视图定义。

    二、简答题(共5题,每题7.5分)

    1.请简述Hibernatejdbc的联系。

    2.请简述MyBatisHibernate的区别。

    3.请详细描述在HibernateJava对象的三种状态是如何转换的。

    4.请简述Hibernate是如何实现分页的?如果不使用Hibernate提供的方法实现分页功能,则采用什么方式分页?

    5.根据员工表编写规范的存储过程。完成以下任务:

    1).给指定员工涨工资,其中员工编号和涨的工资金额由输入参数决定

    2).涨工资后,显示所有员工薪水情况

    3).在存储过程中考虑到以下异常:

    A.指定的员工不存在的情况

    B.涨的工资金额小于等于0的情况

    4).编写调用程序,要求测试各种情况

    一、选择题(共25题,每题2.5分,选择一项或多项,漏选错选不得分)

    1

    2

    3

    4

    5

    AC

    AB

    AD

    AD

    ABCD

    6

    7

    8

    9

    10

    D

    ACD

    BD

    ABC

    B

    11

    12

    13

    14

    15

    ABD

    CD

    D

    CD

    ABCD

    16

    17

    18

    19

    20

    C

    ABC

    BCD

    CD

    ABD

    21

    22

    23

    24

    25

    C

    B

    A

    A

    CD

    二、简答题(共5题,每题7.5分)

    1

    评分要点:

    评分点

    分数

    Hibernatejdbc的轻量级封装

    4

    HQL语句也是面向对象的

    3.5

    参考答案:

    Hibernatejdbc的轻量级封装,包括jdbc的与数据库的连接(用hibernate的配置文件实现,本质是封装了jdbc),和查询,删除等代码,都用面向对象的思想用代码联系起来,Hibernate通过hbm 配置文件(或注解)把持久化类的字段和数据库的字段关联起来比如数据库的id

    HQL语句也是面向对象的,它的查询语句不是查询数据库而是查询类的。

    2

    评分要点:

    评分点

    分数

    写出3条满分,少一条扣2分,直到扣完为止

    7.5

    参考答案:

    调优方案:

    Hibernate的调优方案:

    1. 制定合理的缓存策略;
    2. 尽量使用延迟加载特性;
    3. 采用合理的Session管理机制;
    4. 使用批量抓取,设定合理的批处理参数(batch_size;
    5. 进行合理的O/R映射设计

    Mybatis调优方案:

    MyBatisSession方面和HibernateSession生命周期是一致的,同样需要合理的Session管理机制。MyBatis同样具有二级缓存机制。 MyBatis可以进行详细的SQL优化设计。

    1> SQL优化方面

    Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。而MybatisSQL是手动编写的,所以可以按需求指定查询的字段。Hibernate SQL语句的调优需要将SQL打印出来,而HibernateSQL被很多人嫌弃因为太丑了。MyBatisSQL是自己手动写的所以调整方便。但Hibernate具有自己的日志统计。Mybatis本身不带日志统计,使用Log4j进行日志记录

    2> 扩展性方面

    Hibernate与具体数据库的关联只需在XML文件中配置即可,所有的SQL语句与具体使用的数据库无关,移植性很好。MyBatis项目中所有的SQL语句都是依赖所用的数据库的,所以不同数据库类型的支持不好。

    3

    评分要点:

    评分点

    分数

    写出5种转换得满分,少一种扣1分,直到扣完为止

    4

    写出导致转换的方法得满分,少一个扣1分,直到扣完为止。

    3.5

    参考答案:

    瞬时状态转为持久状态

    使用Session对象的save()saveOrUpdate()方法保存对象后,该对象的状态由瞬时状态转换为持久状态。

    使用Session对象的get()load()方法获取对象,该对象的状态是持久状态。

    持久状态转为瞬时状态

    执行Session对象的delete()方法后,对象由原来的持久状态变为瞬时状态,因为此时该对象没有与任何的数据库数据关联。

    持久状态转为游离状态

    执行了Session对象的evict() clear()close()方法,对象由原来的持久状态转为游离状态。

    游离状态转为持久状态

    重新获取Session对象,执行Session对象的update()saveOrUpdate()方法,对象由游离状态转为持久状态,因为该对象再次与Session对象相关联。

    游离状态转为瞬时状态

    执行Session对象的delete()方法,对象由游离状态转为瞬时状态。

    处于瞬时状态或游离状态的对象,会被Java虚拟机按照垃圾回收机制处理。

    使用以下图形描述也可以

    4

    评分要点:

    评分点

    分数

    写出2条满分,少一条扣4分,直到扣完为止

    7.5

    参考答案:

    1Hibernate的分页机制:获得Session对象后,从Session中获得Query对象(或者Criteria对象)。接下来调用以下方法:

    Query.setFirstResult( )(或者Criteria.setFirstResult( )):设置要显示的第一行数据,

    Query.setMaxResults( )(或者Criteria.setMaxResults( )):设置最多要显示几行数据。

    2、不使用Hibernate的分页机制,可采用SQL语句分页,以Oracle为例,

    如:5:为每页显示的记录,2为当前页:

    select b.* from

    (select a.*,rownum rn from

    ( select * from dept order by deptno) a

    ) b

    where b.rn> (2-1)*5 and b.rn<=2*5

    5

    评分要点:

    评分点

    分数

    正确书写存储过程参数

    1

    正确定义游标

    1

    正确处理薪水小于等于0异常

    1

    正确处理员工不存在异常

    1

    正确显式游标内容

    1

    正确调用存储过程-薪水异常

    0.5

    正确调用存储过程-员工编号异常

    0.5

    正确调用存储过程-成功

    1

    存储过程中含有规范中建议的2个返回参数

    0.5

    参考答案:

    CREATE OR REPLACE PROCEDURE raise_salary
       (eno    NUMBER, --输入参数,雇员编号
        salary NUMBER, --输入参数,雇员薪水
        on_Flag OUT number,       --执行状态
        os_Msg  OUT VARCHAR2       --提示信息
    ) IS
       CURSOR  emp_cur IS
          SELECT ename,sal FROM employee;
       v_emp emp_cur%ROWTYPE;
       exp1 EXCEPTION;
       exp2 EXCEPTION;
    BEGIN
       IF salary<=0 THEN
          RAISE exp1;
       END IF;
       UPDATE EMPLOYEE
          SET sal=sal+salary
        WHERE empno=eno; 
       IF SQL%NOTFOUND THEN
          RAISE exp2;
       END IF;
       on_Flag:=1;
       os_Msg:='修改成功';
       OPEN emp_cur;
       LOOP
          FETCH emp_cur INTO v_emp;
          EXIT WHEN emp_cur%NOTFOUND;
          dbms_output.put_line(v_emp.ename||v_emp.sal);
       END LOOP;
       CLOSE emp_cur;
    EXCEPTION
       WHEN exp1 THEN
          on_Flag:=-1;
          os_Msg:='涨的薪水不能小于等于0。';
       WHEN exp2 THEN
          on_Flag:=-2;
          os_Msg:='不存在该员工。';
       WHEN OTHERS THEN
          on_Flag:=SQLcode;
          os_Msg:=SQLERRM;
    END;
    
    
    --调用1不存在该员工
    DECLARE
     v_empno employee.empno%TYPE:=1234;
     v_sal employee.sal%TYPE:=50;
     on_Flag number(1);     --执行状态
     os_Msg VARCHAR2(200);       --提示信息    
    BEGIN
       raise_salary(v_empno,v_sal,on_Flag,os_Msg);
       IF on_flag=1 THEN
          dbms_output.put_line(os_msg);
       END IF;
       IF on_flag=-1 THEN
          dbms_output.put_line(os_msg);
       END IF;
       IF on_flag=-2 THEN
          dbms_output.put_line(os_msg);
       END IF;
    END;
    
    --调用2涨的薪水不能小于等于0
    DECLARE
     v_empno employee.empno%TYPE:=7788;
     v_sal employee.sal%TYPE:=0;
     on_Flag number(1);     --执行状态
     os_Msg VARCHAR2(200);       --提示信息    
    BEGIN
       raise_salary(v_empno,v_sal,on_Flag,os_Msg);
       IF on_flag=1 THEN
          dbms_output.put_line(os_msg);
       END IF;
       IF on_flag=-1 THEN
          dbms_output.put_line(os_msg);
       END IF;
       IF on_flag=-2 THEN
          dbms_output.put_line(os_msg);
       END IF;
    END;
    
    --调用3修改成功
    DECLARE
     v_empno employee.empno%TYPE:=7788;
     v_sal employee.sal%TYPE:=50;
     on_Flag number(1);     --执行状态
     os_Msg VARCHAR2(200);       --提示信息    
    BEGIN
       raise_salary(v_empno,v_sal,on_Flag,os_Msg);
       IF on_flag=1 THEN
          dbms_output.put_line(os_msg);
       END IF;
       IF on_flag=-1 THEN
          dbms_output.put_line(os_msg);
       END IF;
       IF on_flag=-2 THEN
          dbms_output.put_line(os_msg);
       END IF;
    END;
  • 相关阅读:
    中国3G网络频段
    Cortex系列M0-4简单对比
    PLUM_LITE 系统框图
    POE原理
    Excel 自动分列实现一则
    记Discuz X3.4 Windows部署后无法上传附件的问题
    在64位PC的32位COM组件注册失败
    以管理员运行批处理时修正当前路径
    记录type cover失灵
    AutoCAD Viewcube and Navigation bar not diplayed in some viewports
  • 原文地址:https://www.cnblogs.com/System-out-println/p/5805547.html
Copyright © 2011-2022 走看看