Spring和Hibernate面试题目

1、什么是MVC设计模式

模型-视图-控制器(Model-View-Controller)。MVC架构的Web应用程序被分割成若干逻辑部件,把各种对象按照功能的不同分割成了3部分,主要目的就是为了将各种对象的耦合度降到最低。被分割成的3个部分为:模型(Model)、视图(View)、控制器(Controller)。

  1. 模型(Model):代表了应用程序的数据和处理这些数据的规则。当模型发生变化时,它会通知视图,并为视图提供查询模型相关状态的能力;
  2. 视图(View):用来组织模型的内容,它从模型中获取数据,然后将数据展现给用户,该角色往往由JSP承担;
  3. 控制器(Controller):负责从客户端接收请求,并把这些请求转换成某种行为。这些行为完成以后,在选择一个视图呈现给用户。
    在这里插入图片描述
    MVC结构如上图,可以将页面的显示、业务逻辑的处理和流程的控制很清晰的分离开来。JSP负责数据的显示,JavaBean负责业务逻辑的处理,Servlet负责流程的控制。

2、如何编写一个MVC的JavaWeb应用程序

采用Servlet、JSP和JavaBean开发一个MVC模式的应用程序时候,有以下几步:

  1. 开发Model。主要是开发JavaBean,它的作用的数据的存取;
  2. 开发Views。主要是开发JSP,它的作用的从JavaBean中读取数据进行展示;
  3. 开发Controller。主要是开发Servlet,它的作用是根据请求的参数或URL不同,转发相应的请求,一般还会进行数据的创建和填充。

3、什么是对象关系映射模型(ORM)

对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库之间的互不匹配的现象的技术。ORM可以按照面向对象的思想来操作关系数据库中的数据。
ORM的诞生是数据持久化技术发展的结果。由于目前关系数据库是数据持久化的最佳和最普遍的解决方案,但是程序员更远西使用面向对象的思想对待数据,而不是关系模型,因此ORM的诞生就屏蔽了它们两者的差异。

4 – 11题为Hibernate题目

4、Hibernate的基本使用思想是什么

Hibernate是一个开源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,提供了另外一套的API来操作数据。
其中与数据直接打交道的组件是Session,它是Hibernate的一级缓存,保持着应用程序与数据之间的链接,通过它来保持内存与数据库之间的数据同步。Session是由SessionFactory来创建的,代表的含义是数据源,通常指向某个数据库。
而SessionFactory是由Configuration来创建,代表的是Hibernate程序的数据源及其相关属性的配置信息。
如果需要使用事务,则可以通过Session打开、提交和回滚事务。另外,如果需要使用比较复杂的查询功能,还会使用Query接口,也是通过Session来获得。
在这里插入图片描述
Hibernate的API中,Session、SessionFactory、Configuration、Transaction和Query是它5个最重要的接口。

5、Hibernate的实体存在哪几种状态

1.瞬时态
用new语句创建的实体对象就属于瞬时状态,它此时一般没有id值;

2.持久状态
存在于Session中的实体对象就属于持久状态,一般通过save()、saveOrUpdate()等方法转换而来;

3.托管状态
当实体从Session中脱离出来的时候,他的状态就是托管状态了,尽管它具有ID值,但是它并不在Session中,即使实体的数据发生变化,也不能同步到数据库中,通过调用close()、evict()等方法转换而来。
下图为实体对象的生命周期的状态及其转换过程。
在这里插入图片描述

6、HQL查询语言的使用方法

HQL是一种Hibernate的查询语言,语法类似于SQL,但是HQL操作的对象是实体,基本语法为:

	 Select/update/delete ... from ... where ... group by ... having ... order by ... asc/desc

HQL语句一般在Query中使用,通过Session的createQuery()方法获得。可以用于实体查询、实体的更新和删除、属性查询、排序和分组查询等,也可以使用占位符来动态的设置参数。

7、如何使用Hibernate进行分页查询

Hibernate在实现分页查询的时候,开发者处理提供的HQL语句外,还需要提供从哪行开始(startIndex)和最多的行数(maxLength)两个信息个Hibernate即可,并分别调用Query接口的setFirstResult()和setMaxResult()方法。

8、get()和load()方法的区别是什么?

hibernate对于load()方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常了,而get()可以不存在。

9、如何映射一对一关系

建立一对一关系的时候,需要保证数据库和实体之间都是一对一的关系统一。在数据库中,一般用一张表中的一条记录在另一张表中有且只有一条记录,与其对应的形式来表示一对一的关系。而在Java代码中,实体类需要加上对方的引用。
在映射配置文件中,需要再双方都加上标签。对于键外的一方,主键的生成策略则采用外键(foreign)生成策略。

10、如何映射一对多关系

建立一对多关系的时候,需要保证数据库和实体之间都是一对多的关系统一。在数据库中,一般用一张表中的一条记录在另一张表中有且有多条记录,与其对应的形式来表示一对多的关系。而在Java代码中,实体类需要加上对方的引用,另一边需要加上集合类型的引用。
在映射配置文件中,代表“多”的一方需要加上标签,代表队对方的一个引用;而代表“一”的一方需要加上集合标签和标签,代表对对方的多个引用。

11、继承关系的映射策略有哪些

继承关系的映射策略一般有两种形式:所有的类都在一张表中和每个子类一张表。
单表策略的优点在于无需表连接,查询速度快,适合多态查询。缺点是可能会造成表太大的后果,不利于维护。
每个子类一张表的策略优点在于数据存储的比较紧凑,当查询某个子类的数据时速度比较快。缺点则是可能会有很多的表连接,不适合多态查询。

12、Spring依赖注入的方式有哪些

依赖注入,指的是组件之间的依赖关系由容器在运行时决定。控制权由对象本身转向容器;由容器根据配置文件去创建实例,并创建各个实例之间的依赖关系。它的设计细思昂在于将业务代码与程序本身的结构代码分开。容器尽量不要侵入到应用程序中,应用程序本身可以依赖于抽象的接口,容器根据这些接口所需要的资源注入到应用程序中,也就是说应用程序不会主动向容器请求资源;容器会自动把这些对象个应用程序。
IOC容器和核心是Spring提供的Bean工厂(BeanFactory)。在Spring中,Bean工厂创建的各个实例称作Bean。Bean工厂负责读取Bean定义文件,管理对象的加载、生成、维护Bean对象与其他Bean对象的依赖关系,负责Bean的生命周期。一下是一个用户服务Bean的配置实例:

	<bean id="userBean" class="UserBean"></bean>

id是Bean的唯一标示性属性,一个Spring容器中只能有一个id为指定值的Bean,其他Bean如果需要依赖注入该Bean,也需要使用id属性。

Bean工厂在创建Bean的时候,根据配置文件的设置将这些属性都装配好,Spring的依赖注入的两种方式:setter方法注入和构造方法注入。

1.通过setter方法注入

Bean需要按照JavaBean的可编写属性的setter方法的规范来定义。Spring会利用反射机制,在Bean构建好以后,调用setter方法,把属性的值设置给Bean实例。例如,一下是一个用户服务Bean,它包含一个名为str的可写属性

public class UserBean{
	private String str;
	public void setStr(String str){
		this.str = str;
	}
}

然后,可以在配置文件中为str属性赋值,

<bean id="userBean" class="UserBean">
	<property name="str" value="hello user bean"/>
</bean>

List类型的属性装配示例:

<bean id="testBean" class="TestBean">
	<preperty name="listProperty">
		<list>
			<value>1</value>
			<value>2</value>
			<value>3</value>
		</list>
	</property>
</bean>

以上的属性设置,都是用value属性或value标签装配固定的值,如果属性引用的是另外的Bean,就得使用ref或bean属性了。例如,以下是通过setter为UserBean设置UserDaoBean的示例:

	<bean id="userBean" class="UserBean">
		<property name="userDao" ref="userDao"/>
	</bean>
	<bean id="userDao" class="UserDao">
		<!--属性配置-->
	</bean>

2.通过构造方法注入

与setter方法注入不同,构造犯法注入是在创建Bean实例的时候,通过调用Bean的构造方法来注入属性的值。它使用的是标签,也可以通过标签或标签指定属性的值或者引用的Bean实例,示例如下:

public class ConTestBean{
	private String str;
	private UserBean userBean;
	public ConTestBean(String str,UserBean userBean){
		this.str=str;
		this.userBean = userBean;
	}
}

通过构造方法注入ConTestBean需要的属性代码如下:

	<bean id="ConTestBean" class="com.test.ConTestBean">
		<constructor-arg index="0">
			<value>hello construct bean</value>
		</constructor-arg>
		<constructor-arg index="1">
			<ref bean="userBean"/>
		</constructor-arg>
	</bean>

13、如何使用Spring的声明式事务

AOP是一种对OOP有益补充的编程技术,它可以解决OOP和过程化不能够很好解决的横切问题,例如,事务、安全、日志等。

支持当前事务的情况

  1. TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  2. TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;否则以非事务的方式继续运行。
  3. TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,加入该事务;否则抛出异常。

不支持当前事务的情况

  1. TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新事务,如果当前存在事务,则把当前事务挂起。
  2. TransactionDefinition.PROPAGATION_NOT_SUPPORT:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  3. TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。

其他情况

TransactionDefinition.PROPAGATION__NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

14、如何使用JPA在数据库中非持久化一个字段

假如有下面一个类:

Entity(name="USER")
public class User{
	@ID
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "ID")
	private Long id;
	
	@Column(name = "USER_NAME")
	private String userName;

	@Column(name = "PASSWORD")
	private String password;

	private String secrect;
}

如果想让secret这个字段不被持久化,也就是不被数据库存储怎么办?可以采用以下几种方法:

	static String transient1;
	final String transient2 = "Statish";
	transient String transient3;
	@Transient
	String transient4;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值