首页 > 代码库 > Hibernate内测总结

Hibernate内测总结

 

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

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

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

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

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

 

选项C中 SQL Server不支持序列

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

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

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

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

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

 

脏检查以及刷新缓存
1.脏检查是事务提交的时候进行的

2.刷新缓存:刷新缓存的事情就是脏检查
两种方式:
方式一:事务提交
方式二:session.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

 

关于HQL
from Dept 检索所有部门的信息
select d from cn.happy.entity.Student d 检索所有部门的信息 很2的写法
select d from Dept d

 

 

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

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

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

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

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

iterate()返回的是主键值 而不是返回所有记录

 

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

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

BsetParameter( )有重载的方法

CsetProperties( )有重载的方法

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

ABCD

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属性用于指定维护关联关系的那一方

 

7.inverse
解析:维护关联关系
true: 自己不维护关联关系,对方维护
false:自己维护关联关系

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

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

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

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

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

 

8.延迟加载 lazy
分类
类级别 true(默认),false
一对多和多对多 true(default),false,extra(加强延迟加载)
多对一(没有set) proxy(default),no-proxy,false

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

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

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

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

D<component>标签有idnameclass属性

 


9.component组件映射
<hibernate-mapping package="cn.happy.component">
<class name="EmpInfo" table="EMPINFO">
<id name="eid" column="EID">
<generator class="native"></generator>
</id>
<property name="ename" column="ENAME" type="string"></property>
<component name="ehome" class="EmpHomeAddress">
<parent name="empinfo"/>
<property name="ehomestreet" column="EHOMESTREET" type="string"></property>
<property name="ehomecity" column="EHOMECITY" type="string"></property>
<property name="ehomeprovince" column="EHOMEPROVINCE" type="string"></property>
<property name="ehomezipcode" column="EHOMEZIPCODE" type="string"></property>
</component>
</class>
</hibernate-mapping>

 

 

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

A<sqlMapConfig>

B<configuration>

C<setting>

D<environments>

MyBatis根元素使用的是<configuration>

 

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

AExecutorType.SIMPLE

BExecutorType.BATCH

CExecutorType.EXECUTE

DExecutorType.REUSE

 

ExecutorType
public final enum org.apache.ibatis.session.ExecutorType {

// Field descriptor #8 Lorg/apache/ibatis/session/ExecutorType;
public static final enum org.apache.ibatis.session.ExecutorType SIMPLE;

// Field descriptor #8 Lorg/apache/ibatis/session/ExecutorType;
public static final enum org.apache.ibatis.session.ExecutorType REUSE;

// Field descriptor #8 Lorg/apache/ibatis/session/ExecutorType;
public static final enum org.apache.ibatis.session.ExecutorType BATCH;

 

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

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

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

CSessionclear( )方法用于刷新缓存

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

clear()是清空缓存,flush()是刷新缓存

 

 

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

Ainner join join用于内连接

Binner join fetchjoin fetch用于迫切内连接

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

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

 

inner join 或 join用于内连接
inner join fetch或 join fetch用于迫切内连接
left outer join fetch 或 left join fetch用于迫切左外连接

没有迫切右外连接

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

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

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

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

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

 

12.批量处理数据

方式一:
使用HQL语句
原理: executeUpdate
01.批量插入数据
@Test
public void testInsert(){
Session session = HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
String hql="insert into Dept(deptName) select d.deptName||d.deptNo from Dept d where d.deptNo>0";
session.createQuery(hql).executeUpdate();
tx.commit();
}

方式二:JDBCAPI
//使用JDBC API进行批量修改
public void testUpdateUseJDBC(){
Session session = HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
Work work=new Work() {
@Override
public void execute(Connection connection) throws SQLException {
String sql="update DEPTY2160New set deptName=? where deptNo>?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, "财务部2");
ps.setInt(2, 1);
ps.executeUpdate();
}
};
session.doWork(work);
tx.commit();
}


方式三: 使用Session进行批量操作

public void testAdd(){
Session session = HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
Emp emp=null;
for (int i = 0; i < 10000; i++) {
emp=new Emp(i, "emp"+i);
session.save(emp);
if (i%30==0) {
session.flush();
session.clear();
}
}
tx.commit();
}

little tip:
(1)使用HQL进行批量操作 数据库层面 executeUpdate()
(2)使用JDBC API进行批量操作 数据库层面
(3)使用Session进行批量操作 会进缓存


little tip2:
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”意思相同

 C选项中返回的是任意一条记录

 

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

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

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

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

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

 

1.原生SQL查询
@Test
//原生SQL执行
public void testClassicSQL(){
SQLQuery query = session.createSQLQuery("select * from deptY2160new").addEntity(Dept.class);
List<Dept> list = query.list();
for (Dept dept : list) {
System.out.println(dept.getDeptName());
}
tx.commit();
}


2.命名查询
<!-- -原生SQL NullPointException -->
<sql-query name="selectEmpByDetpNoClassicSQL">
<return alias="e" class="Emp" ></return>
select {e.*} from EmpY2160new e where deptNo=:deptNo
</sql-query>

测试类
public void testNamedClassicSQL(){
Query query = session.getNamedQuery("selectEmpByDetpNoClassicSQL");
List<Emp> list = query.setParameter("deptNo", 1).list();
/* for (Emp emp : list) {
System.out.println(emp.getEmpName());
}*/
tx.commit();
}

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用于定义主键值的生成策略

 

Hibernate常见注解
@Id
@Column
@Table
@Entity
@GeneratedValue
@ManyToOne
@JoinColumn

 

Hibernate内测总结