Hibernate复习题1含答案要点
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
美斯坦福在线考试系统荆州理工G3 Hibernate
科目: SCCEG3Hibernate总分: 100分时间: 60分钟
一、单选题(共45题,每题2分,说明:选择一项正确的答案)
1、
下面关于Hibernate的说法,错误的是()
A、Hibernate是一个“对象-关系映射”的实现
B、Hibernate是一种数据持久化技术
C、Hibernate是JDBC的替代技术他是对JDBC做了轻量级的对象封装
D、使用Hibernate可以简化持久化层的编码
参考答案: C
2、
在使用了Hibernate的系统中,要想在删除某个客户数据的同时删除该客户对应的所有订单数据,下面方法可行的是()
A、配置客户和订单关联的cascade属性为save-update
B、配置客户和订单关联的cascade属性为all
C、设置多对一关联的inverse属性为true
D、设置多对一关联的inverse属性为false
参考答案: B
详解
3、
下面一对多关联的配置中,存在哪些错误()
<set name="orders" inverse="false" cascade="true">
<one-to-many class="com.x.entity.Order"
column="customer_id" />
</set>
A、inverse属性不可以设置为false
B、cascade属性不可设置为true
C、class="com.x.entity.Order"应为type="com.x.entity.Order"
D、column属性不可再<one-to-many>节点内设置
参考答案: B
4、
下面创建Criteria对象的语句中正确的是()
A、Criteria c = query.createCriteria();
B、Criteria c = query.addCriteria();
C、Criteria c = session.createCriteria();
D、Criteria c = session.createCriteria(User.class);
参考答案: D
5、
下面关于Hibernate映射文件配置中dynamic-update属性说法正确的是()详解
A、动态的修改,如果为true,只改变有改变的属性
B、动态的修改,如果为true,只改变没有改变过的属性
C、动态的修改,如果为true,改变所有的属性
D、以上说法都错
参考答案: A
6、
下面关系Hibernate对象的状态说话正确的是()临时持久化游离
A、Hibernat的对象只有一种状态
B、Hibernat的对象有2种状态
C、Hibernat的对象有3种状态
D、Hibernat的对象有4种状态
参考答案: C
7、
Hibernate对象从瞬时到持久状态转换的方式有()。
A、调用session的s ave方法saveorupdat
B、调用session的create方法
C、调用session的update方法
D、调用session的load方法
参考答案: A
8、
J2EE中往往使用____封装业务实体,____封装业务逻辑,____调用()
A、实体Bean、会话Bean、实体Bean、会话Bean
B、实体Bean、会话Bean、会话Bean、实体Bean
C、会话Bean、实体Bean、实体Bean、会话Bean
D、会话Bean、实体Bean、会话Bean、实体Bean
参考答案: B
9、
EJB分为()三种类型
A、会话bean、实体bean、Web service
B、会话bean、实体bean、消息驱动bean
C、Jsp、servlet、jsf
D、实现类、Home接口类、Object接口类
参考答案: B
10、
有状态Session Bean和无状态Session Bean的区别说法正确的是()详解
A、无状态Session Bean要保存客户端的状态,同客户端是一对一
B、有状态Session Bean要保存客户端的状态,同客户端是一对一
C、他们都要保存客户端的状态,同客户端是一对一
D、以上说法都不对
参考答案: B
11、
有以下代码段,下面说法正确的是()p65
String qlString = "select model from Student as model where
model.createDate = ?1"; (1)
Query query = em.createQuery(qlString); (2)
query.setParameter(0, "2000-12-05"); (3)
List list = q.list(); (4)
A、第一行有错,必须为参数起个名字
B、第三行有错误,query.setParameter(0,
"2000-12-05")应为query.setParameter(1, "2000-12-05");
C、第四行没有错误
D、这些语句没有错误
参考答案: B
12、
在EJB3.0中用来保存一个对象的方法是()
A、save
B、update
C、persist
D、create
参考答案: C
13、
在J2EE中,Servlet和JSP组件必须在()容器中才能运行
A、Applet
B、客户端
C、Web
D、EJB
参考答案: C
14、
在J2EE中,EJB组件必须在()容器中才能运行
A、Applet
B、客户端
C、Web
D、EJB
参考答案: D
15、
在三层结构中,数据访问层承担的责任是()
A、定义实体类
B、数据的增删改查操作
C、业务逻辑的描述
D、页面展示和控制转发
参考答案: B
16、
<set>元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,casecade属性应该取(
)值
A、none
B、save
C、delete
D、save-update
参考答案: D
17、
以下程序的打印结果是()
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、运行出错,抛出异常
B、打印false
C、打印true
D、编译出错
参考答案: C
18、
以下程序代码对Customer的name属性修改了两次:
tx = session.beginTransaction();
Customer customer=(Customer)session.load(Customer.class,
new Long(1));
customer.setName("Jack\");
customer.setName("Mike\");
mit();
执行以上程序,Hibernate需要向数据库提交()条update语句
A、0
B、1
C、2
D、3
参考答案: B
19、
对于以下程序,Customer对象在第()行变为游离状态close clear evict P82
Customer customer=new Customer();
customer.setName(\"Tom\");
Session session1=sessionFactory.openSession();
Transaction tx1 = session1.beginTransaction(); //line1
session1.save(customer); //line2
mit(); //line3
session1.close(); //line4
A、line1
B、line2
C、line3
D、line4
参考答案: D
20、
以下检索策略中,()利用了外连结查询
详解20
A、立即检索
B、延迟检索
C、迫切左外连结检索
D、迫切右外连结检索
参考答案: C
21、
假设对Customer类的orders集合采用延迟检索策略,编译或运行以下程序,会出现()
Session session=sessionFactory.openSession();
tx = session.beginTransaction();
Customer customer=(Customer)session.get(Customer.class,new
Long(1));
mit();
session.close();
Iterator orderIterator=customer.getOrders().iterator();
A、编译出错
B、编译通过,正常运行,不显示任何信息
C、编译通过,正常运行,并显示出结果
D、编译通过,但运行时抛出异常
参考答案: D
22、
在源代码中嵌入映射信息需要()
A、Annoation
B、hbm.xml
C、struts.xml
D、web.xml
参考答案: A
23、
ORM的好处包括()
A、能进行关系对象的映射
B、具有控制器功能
C、能在服务器端保存客户端状态
D、向DTO一项能传递数据
参考答案: A
24、
已知某个实例的持久化标识,可以使用Session的()方法来获取它
A、load()
B、loadAll()
C、getAllData()
D、init()
参考答案: A
25、
如果不确定所寻找对象的持久化标识符,则需要使用查询,使用Session 的()方法
A、createQuery()
B、query()
C、queryAll()
D、queryObject()
参考答案: A
26、
使用Session的(),会把对象的状态从数据库中移除
A、delete()
B、remove()
C、clear()
D、removeAll()
参考答案: A
27、
对原生SQL查询的控制是通过()接口进行的
A、SQLQuery
B、Session
C、List
D、Query
参考答案: A
28、
可以把结果集映射的信息放在外部的(
)元素中,这样就可以在多个命名查询间或者通过setResultSetMapping()API 来访问
A、<resultset>
B、<result>
C、<mapping>
D、<description>
参考答案: A
29、
使用Hibernate的QBC查询,要使用SQL中的类似select count(*) from
tablename方法求出记录数,必须使用()类
A、Restrictions
B、Projections
C、Criteria
D、Criteron
参考答案: B
30、
在Hibernate中,关于数据库的方言,下面说法正确的是()
A、可以不写数据库方言
B、数据库方言没有作用,可以随便写
C、有通用的数据库方言可以使用
D、数据方言对应于每个数据库,主要用于产生SQL语句
参考答案: D
31、
下面不属于持久化的是()
A、把对象转换称字符串的形式通过网络传输,在另一端接收到这个字符串后能把对象还原出来
B、把程序数据从数据库中读出来
C、从XML配置文件中读取程序的配置信息
D、把程序数据保存为文件
参考答案: A
32、
下面的程序执行后没有报错,但数据总保存不到数据库,最可能的原因是()
public static void imain(String[] args){
SessionFactory sf=new
Configration().configure().buildSessionFactory();
Session session=sf.openSession();
Medal medal=new Medal();
medal.setOwner(“totong”);
medal.setType(“Gold medal”);
session.save(user);
session.close();
}
A、配置文件配置有误
B、没有在配置文件中包含对映射文件的声明
C、配置文件配置有误
D、没有对持久化操作捕捉异常
E、没有开启事务
参考答案: E
33、
已知wage.getItem().size()的值是1。
要想使执行session.update(wage)时自动执行session.update(wage.getItems().get(0)),必须配置(
)
A、<set name=”items” inverse=”true” cascade=”none”>…</set>
B、<set name=”items” inverse=”false” cascade=”none”>…</set>
C、<set name=”items” inverse=”true” cascade=”all”>…</set>
D、<set name=”items” inverse=”false”
cascade=”save-update”>…</set>
参考答案: D
34、
在Hibernate关系映射配置中,inverse属性的含义是()。
A、定义在<one-to-many>节点上,声明要负责关联的维护
B、声明在<set>节点上,声明要对方负责关联的维护
C、定义在<one-to-many>节点上,声明对方要负责关联的维护
D、声明在<set>节点上,声明要负责关联的维护
参考答案: B
35、
执行下面的hql查询,关于返回值的说法,正确的是()select ername,erid
from er u
where u is not null
A、语法错误,不能执行
B、返回一个类型为List的实例
C、返回一个数组
D、当返回结果只有一条时,返回一个数组
参考答案: B
36、
以下哪一种检索策略利用了外连结查询()
A、立即检索
B、延迟检索
C、迫切左外连结检索
D、迫切右外连结检索
参考答案: C
37、
POJO是()
A、Plain Old Java Object
B、Programming Object Java Object
C、Page Old Java Object
D、Plain Object Java Old
参考答案: A
38、
实现equals和hashCode最显而易见的作用是()详解38
A、比较两个对象标识符的值
B、比较数据库的两条数据
C、比较两个组建是否部署在同一个应用服务器上
D、对象与字段的映射
参考答案: A
39、
在源代码中嵌入映射信息需要()
A、XDoclet
B、EJB
C、Hibernate
D、Spring
参考答案: A
40、
所有的Hibernate,除了()都支持空(null)语义
A、Collection
B、Element
C、Entity
D、NodeList
参考答案: A
41、
()元素把子对象的一些元素与父类对应的表的一些字段映射起来
A、Component
B、Element
C、Attribute
D、ActionForm
参考答案: A
42、
HQL不支持聚合函数有()
A、count(*)
B、avg(…)
C、count(…)
D、count(?)
参考答案: D
43、
假设实体映射时有一个()的关联指向另外一个实体,在查询时必须也返回那个实体,否则会导致发生一个”column
not found”的数据库错误
A、many-to-one
B、many-to-many
C、one-to-many
D、one-to-one
参考答案: D
44、
在Hibernate中,关于数据库的方言,下面说法正确的是()
A、可以不写数据库方言
B、数据库方言没有作用,可以随便写
C、有通用的数据库方言可以使用
D、数据方言对应于每个数据库,主要用于产生SQL语句
参考答案: D
45、
下列属于多对一关系的是()
A、书和作者
B、手机和生产厂家
C、用户和发布的出租信息
D、士兵和班长
参考答案: D
二、多选题(共5题,每题2分),说明:选择多项正确的答案)
1、
从持久化状态到临时状态转换的方法有()[选三项]
A、evict()
B、clear()
C、close()
D、lock()
参考答案: ABC
2、
有如下代码
Dept deptOne = new Dept();
deptOne.setDeptName("后勤部");
deptOne.setCreateDate("2001-03-02");
session.save(deptOne);
Integer deptId = deptOne.getDeptId();
deptOne = null;
下面说明正确的有()[选两项]
A、deptOne处于生命周期
B、deptOne生命周期结束
C、deptOne处于持久化状态
D、deptOne处于游离状态
参考答案: AC
3、
Hibernate缓存主要从哪些方面发生作用()[选两项] 见书P84
A、通过主键值加载数据
B、查询数据
C、立即加载
D、延迟加载
参考答案: AD
4、
什么是Hibernate一级缓存()[选两项]
A、Hibernate一级缓存是Session的缓存
B、Hibernate一级缓存是SessionFactory的缓存
C、第一级缓存为必需,不允许且事实上也无法被卸除
D、第一级缓存可以设置
参考答案: AC
5、
不适合放入Hibernate二级缓存的有()[选三项]
A、常被修改的数据
B、绝不容许出现并发的数据,例如财务数据
C、与其他应用共享的数据
D、常用数据
参考答案: ABC
详解5
Hibernate中dynamic-insert和dynamic-update 设置属性默认值Hibernate允许我们在映射文件里控制insert和update语句的内容.比如在映射文件中<property 元素中的update属性设置成为false,那么这个字段,将不被包括在基本的update语句中,修改的时候,将不包括这个字段了.insert同理.dynamic动态SQL语句的配置也是很常用的.下面介绍配置SQL语句的具体属性:
1)<property>元素insert属性:设置为false,在insert语句中不包含这个字段,表示永远不会被插入,默认true
2)<property>元素update属性:设置为false,在update语句中不包含这个字段,表示永远不会被修改,默认true
3)<class>元素mutable属性:设置为false就是把所有的<property>元素的update属性设置为了false,说明这个对象不会被更新,默认true
4)<property>元素dynamic-insert属性:设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false
5)<property>元素dynamic-update属性,设置为true,表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中,默认false
6)<class>元素dynamic-insert属性:设置为true,表示把所有的<property>元素的dynamic-insert属性设置为true,默认false
7)<class>元素dynamic-update属性:设置为true,表示把所有的<property>元素的dynamic-update属性设置为true,默认false
Hibernate生成动态SQL语句的消耗的系统资源(比如CPU,内存等)是很小的,所以不会影响到系统的性能,如果表中包含N多字段,建议把dynamic-update属性和insert属性设置为true,这样在插入和修改数据的时候,语句中只包括要插入或者修改的字段.可以节省SQL语句的执行时间,提高程序的运行效率.
详解10
现实中,很多朋友对两种session bean存在误解,认为有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用,而认为无状态是每次调用实例化一次,不保留用户信息。
仔细分析并用实践检验后,你会发现,事实恰好相反:有状态和无状态会话bean的本质区别是它们的生命期。
首先解释一个下面要用到的概念--用户:session bean 的用户实际上就是直接调用ejb的类的实例,甚至是这个实例的某个方法。
同一个类的不同实例对于session bean 来说是不同的用户。
有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean 的生命期也告结束。
即每个用户最初都会得到一个初始的bean。
无状态会话bean :bean一旦实例化就被加进会话池中,各个用户都可以共用。
即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。
由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。
但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。
详解20
Hibernate 提供了3 种检索策略:
l 延迟检索;
l 立即检索;
l 迫切左外连接;
Hibernate 提供2 种方式来确定检索策略,一中是在配置文件当中,另外一种是在程序种设置。
当然,如果你在程序中设置了检索策略,那么你在配置文件中的设置也就无效了。
另外的一种情况是HQL 会忽略配置文件的设置,而总是采用迫切左外连接。
详解38
原因是由于在Hibernate中,需要保证持久化标识(数据库的行)和仅在特定会话范围内的Java 标识是等值的。
我们必然希望Set有明确的语义,以避免混合了来自不同会话中获取的实例,从而确保数据的持久化不会发生错误。
若使用过Set,你会知道Set中是不允许存储重复值的,这也是为什么Hibernate推荐在多表关联的映射中采用Set作为存储实体对象的主要原因。
详解3
1.明确inverse和cascade的作用
inverse 决定是否把对对象中集合的改动反映到数据库中,所以inverse只对集合起作用,也就是只对one-to-many或many-to-many有效(因为只有这两种关联关系包含集合,而one-to-one和many-to-one只含有关系对方的一个引用)。
cascade决定是否把对对象的改动反映到数据库中,所以cascade对所有的关联关系都起作用(因为关联关系就是指对象之间的关联关系)。
2.inverse属性:inverse所描述的是对象之间关联关系的维护方式。
inverse只存在于集合标记的元素中。
Hibernate提供的集合元素包括<set/> <map/> <list/> <array /> <bag />
Inverse属性的作用是:是否将对集合对象的修改反映到数据库中。
inverse属性的默认值为false,表示对集合对象的修改会被反映到数据库中;inverse=false 的为主动方,由主动方负责维护关联关系。
inverse=”true” 表示对集合对象的修改不会被反映到数据库中。
为了维持两个实体类(表)的关系,而添加的一些属性,该属性可能在两个实体类(表)或者在一个独立的表里面,这个要看这双方直接的对应关系了:这里的维护指的是当主控放进行增删改查操作时,会同时对关联关系进行对应的更新。
一对多:该属性在多的一方。
应该在一方的设置inverse=true ,多的一方设置inverse=false(多的一方也可以不设置inverse属性,因为默认值是false),这说明关联关系由多的一方来维护。
如果要一方维护关系,就会使在插入或是删除"一"方时去update"多"方的每一个与这个"一"的对象有关系的对象。
而如果让"多"方面维护关系时就不会有update 操作,因为关系就是在多方的对象中的,直指插入或是删除多方对象就行了。
显然这样做的话,会减少很多操作,提高了效率。
注:
单向one-to-many关联关系中,不可以设置inverse="true",因为被控方的映射文件中没有主控方的信息。
多对多:属性在独立表中。
inverse属性的默认值为false。
在多对多关联关系中,关系的两端inverse不能都设为false,即默认的情况是不对的,如果都设为false,在做插入操作时会导致在关系表中插入两次关系。
也不能都设为true,如果都设为true,任何操作都不会触发对关系表的操作。
因此在任意一方设置inverse=true,另一方inverse=false。
一对一:其实是一对多的一个特例,inverse 的设置也是一样的,主要还是看关联关系的属性在哪一方,这一方的inverse=false。
多对一:也就是一对多的反过来,没什么区别。
2.cascade属性
cascade属性的作用是描述关联对象进行操作时的级联特性。
因此,只有涉及到关系的元素才有cascade属性。
具有cascade属性的标记包括<many-to-one /> <one-to-one /> <any /> <set /><bag /> <idbag /> <list /> <array />
注意:<ont-to-many />和<many-to-many />是用在集合标记内部的,所以是不需要cascade属性的。
级联操作:指当主控方执行某项操作时,是否要对被关联方也执行相同的操作。
3.inverse和cascade的区别
作用的范围不同:
Inverse是设置在集合元素中的。
Cascade对于所有涉及到关联的元素都有效。
<many-to-one/><ont-to-many/>没有inverse属性,但有cascade属性
执行的策略不同
Inverse 会首先判断集合的变化情况,然后针对变化执行相应的处理。
Cascade 是直接对集合中每个元素执行相应的处理执行的时机不同
Inverse是在执行SQL语句之前判断是否要执行该SQL语句
Cascade则在主控方发生操作时用来判断是否要进行级联操作
执行的目标不同
Inverse对于<ont-to-many>和<many-to-many>处理方式不相同。
对于<ont-to-many>,inverse所处理的是对被关联表进行修改操作。
对于<many-to-many>,inverse所处理的则是中间关联表
Cascade不会区分这两种关系的差别,所做的操作都是针对被关联的对象。
总结:
<one-to-many>中,建议inverse=”true”,由“many”方来进行关联关系的维护
<many-to-many>中,只设置其中一方inverse=”false”,或双方都不设置
Cascade,通常情况下都不会使用。
特别是删除,一定要慎重。
操作建议
一般对many-to-one和many-to-many不设置级联,这要看业务逻辑的需要;对one-to-one和one-to-many设置级联。
many-to-many关联关系中,一端设置inverse=”false”,另一端设置为inverse=”true”。
在one-to-many关联关系中,设置inverse=”true”,由多端来维护关系表。