未来_我来
因为渴望改变,所以必须努力

简答题:

1、什么是ORM?

答:对象关系映射(Object—Relational Mapping,简称ORM)是一种为了解决面向对象与面向关系数据库存在的互不匹配的现象的技术;简单的说,ORM 是通过使用描述对象和数据库之间映射的元数据,将java 程序中的对象自动持久化到关系数据库中;本质上就是将数据从一种形式转换到另外一种形式。

2、解释数据持久化的好处?

答:数据库的读写是一个很耗费时间和资源的操作,当大量用户同时直接访问数据库的时候,效率将非常低,如果将数据持久化就不需要每次从数据库读取数据,直接在内存中对数据进行操作,这样就节约了数据库资源,而且加快了系统的反映速度。

3、Hibernate 有哪5 个核心接口?它们的作用分别是什么?

答:1)Configuration 接口:配置Hibernate,根据其启动hibernate,创建SessionFactory 对象; 2)SessionFactory 接口:初始化Hibernate,充当数据存储源的代理,创建session 对象,sessionFactory 是线程安全的,意味着它的同一个实例可以被应用的多个线程共享,是重量级、二级缓存; 3)Session 接口:负责保存、更新、删除、加载和查询对象,是线程不安全的,避免多个线程共享同一个session,是轻量级、一级缓存; 4)Transaction 接口:管理事务; 5)Query 和Criteria 接口:执行数据库的查询。

4、hierbnate的get和load有什么 区别

答: 其实它们也没有什么不同的, 作用其实都是一样的,但是有一定的区别,get是每次都会从数据库取数据以保证数据的可靠性,而load会返回proxy,相当于是一个存根,它的值会去hibernate中的session的二级缓存里去找,如果找不到目则会laxy load一下,简单来说,用get的时候,当为空的时候不会抛出异常,反之load会抛.

session的get()和load()其区别在于:
如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException;load方法可返回实体的代理类实例,而get方法永远直接返回实体类;load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。

 

5、回答以下问题

1)在hibernate 中,在配置文件中显示一对多,多对多的标签是什么?

一对多的标签为<one-to-many> ;多对多的标签为<many-to-many>;

2)Hibernate 的二级缓存是什么?

是SessionFactory的缓存为hibernate 的二级缓存,即会话工厂对象。根据配置对象传递来的数据库连接信息,创建session连接对象,这样执行的就是工厂模式,而且是线程安全的。

二级缓存:
a) 应用及缓存
b) 分布式缓存
条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据

3)Hibernate 是如何处理事务的?

Hibernate 的事务实际上是底层的JDBC Transaction 的封装或者是JTATransaction 的封装;默认情况下使用JDBC Transaction。

6、编写一个Hibernate 的测试文件Test.Java(用代码写出大概流程)

答://首先获得SessionFactory 的对象SessionFactory sessionFactory = new Configuration().configure().

buildSessionFactory();

//然后获得session 的对象

Session session = sessionFactory.openSession();

//其次获得Transaction 的对象

Transaction tx = session.beginTransaction();

//执行相关的数据库操作:增,删,改,查

session.save(user); //增加, user 是User 类的对象

session.delete(user); //删除

session.update(user); //更新

Query query = session.createQuery(“from User”); //查询

List list = query.list();

//提交事务

tx.commit();

//如果有异常,我们还要作事务的回滚,恢复到操作之前

tx.rollback();

//最后还要关闭session,释放资源

session.close();

7、完成对hibernate.cfg.xml的配置,连接本地的oracle数据库

要求如下:数据库名是WISH,要求能在控制台显示sql语句,Parent.hbm.xml文件在于hibernate.cfg.xml文件同一个目录下的example文件夹下,数据库的用户名是:System 密码:Manager 。

<hibernate-configuratoin>

<session-factory>

<property name=”connection.driver_class”> __oracle.jdbc.driver.OracleDriver__ </property>

<property name=”connection.url”> ___jdbc:oracle:thin:@localhost:1521:orcl_ </property>

<property name=”connection.username”> _ System __ </property>

<property name=”connection.password”> __ Manager __</property>

<property name=”show_sql”>___True_</property>

<mapping resource=__example/Parent. hbm.xml__> </mapping>

</session-factory>

</hibernate-configuration>

案例:

<session-factory>  

<property name="dialect">  dialect:方言)

org.hibernate.dialect.Oracle9Dialect

</property>

<property name="connection.url">

jdbc:oracle:thin:@localhost:1521:orcl

</property>

<property name="connection.username">happy</property>

<property name="connection.password">happy</property>

<property name="connection.driver_class">

oracle.jdbc.driver.OracleDriver

</property>

<property name="myeclipse.connection.profile">jdbc/orcl</property>

<property name="show_sql">true</property>

<mapping resource="com/hygj/bean/Student.hbm.xml" />

<mapping resource="com/hygj/bean/Banji.hbm.xml" />

</session-factory>

 

8、写出相应的SQL语句

表message有如下字段

id 文章id

title 文章标题

hits 点击量

(1)创建表message

Create table message (id number(4) not null,title varchar2(50) not null,hits number(10) not null);

(2)插入如下两条信息

1,hero,100;

2,cat,200

Insert into message values (1,hero,100),(2,cat,200);

(3)查询点击量为100的文章标题

Select title from message where hits=100;

(4)删除文章名为cat的文章

Delete from  message where title=cat;

9、Hibernate工作原理及为什么要用?

原理:

1.         读取并解析配置文件

2.         读取并解析映射信息,创建SessionFactory

3.         打开Sesssion

4.         创建事务Transation

5.         持久化操作

6.         提交事务

7.         关闭Session

8.         关闭SesstionFactory

 

为什么要用:

 

1.    JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。

2.    Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作

3.    hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。

4.    hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。


10、 Hibernate是如何延迟加载?

1.         Hibernate2延迟加载实现:a)实体对象  b)集合(Collection

2.         Hibernate3 提供了属性的延迟加载功能

当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。

 

 

11、Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)

类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的one-to-one、one-to-manymany -to-onemany-to-many

 

12、 说下Hibernate的缓存机制

1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存

2. 二级缓存:
a) 应用及缓存
b) 分布式缓存
条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据
c) 第三方缓存的实现

hibernate的缓存:

(1)前提

在Hibernate的处理中,由于使用的手动事务工作,所以,大量的数据就会存在缓存中。

(2)hibernate的缓存的分类

A:一级缓存

session,所有的数据处理,都是在session缓存上实现的。session实质上就是根据当前用户请求线程,分配的缓存空间。由于session本身是 

线程不安全的,所以默认的和当前线程进行了绑定,保证了session的安全。

B:二级缓存

sessionFactory,能被所有的session对象共享的缓存区域。

sessionFactory是线程安全的,可以共享和调用。

C:第三方缓存插件

可以利用第三方的专业的缓存管理的插件对象实现自己的缓存的设置。

(3)缓存的管理

A:能够加载到缓存上的数据

数据量不大的数据

频繁被查询的数据

不会反复被修改的数据

B:手动的进行缓存的清理

getSession().evict(Object):明确清理指定的对象

getSession().flush():强制缓存清空

getSession().close()


13、 Hibernate的查询方式有几种

A)、原生态SQL: 通过createSQLQuery()对象发送语句。

B)、HQL (Hibernate Query Language)、

HQL又分为:标准的HQL和扩展的HQL。通过createQuery()对象发送语句。

C)、Criteria,object comptosition ,通过createCriteria()对象发送语句。

1、  属性查询

2、  参数查询、命名参数查询

3、  关联查询

4、  分页查询

5、  统计函数


14、 如何优化Hibernate?

1.         使用双向一对多关联,不使用单向一对多

2.         灵活使用单向一对多关联

3.         不用一对一,用多对一取代

4.         配置对象缓存,不使用集合缓存

5.         一对多集合使用Bag,多对多集合使用Set

6.         继承类使用显式多态

7.         表字段要少,表关联不要怕多,有二级缓存撑腰

 

 

1.在数据库中条件查询速度很慢的时候,如何优化?
1.建索引
2.减少表之间的关联
3.优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面
4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据

2.在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题?
解决方案一,按照Object[]数据取出数据,然后自己组bean
解决方案二,对每个表的bean写构造函数,比如表一要查出field1,field2两个字段,那么有一个构造函数就是Bean(type1 filed1,type2 field2) ,然后在hql里面就可以直接生成这个bean了。具体怎么用请看相关文档,我说的不是很清楚。

 

*  请你谈谈SSH整合?

SSH:
Struts(表示层)+Spring(业务层)+Hibernate(持久层)
Struts:
Struts是一个表示层框架,主要作用是界面展示,接收请求,分发请求。
在MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发。(View:沿用JSP,HTTP,Form,Tag,Resourse ;Controller:ActionServlet,struts-config.xml,Action)
Hibernate:
Hibernate是一个持久层框架,它只负责与关系数据库的操作。
Spring:
Spring是一个业务层框架,是一个整合的框架,能够很好地黏合表示层与持久层。

 

*  hibernate的核心是什么,他们的相互关系是什么,重要的方法是什么?

Configuration
SessionFactory
  Session如下方法
   Save
   load
   Update
   Delete
Query q=CreateQuery(“from Customer where customerName=:customerName”)
   beginTransaction
   close
   Transaction
   Commit()

 

*  hibernate中对象的三种状态

瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)。

 

Persitent状态的对象不能引用Transient对象,不然会抛出TransientObjectException异常
Transient(瞬时)状态的特征:
* 在数据库中没有与之匹配的数据
* 没有纳入session的管理
可通过session的save()或 saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象。
Persistent(持久)状态的特征:
* persistent状态的对象在数据库中有与之匹配的数据
* 纳入了session的管理
* 在清理缓存(脏数据检查)的时候,会和数据库同步
Detached(游离)状态的特征:
* 在数据库中有与之匹配的数据
* 没有纳入session的管理
当与某持久对象关联的session被关闭后,该持久对象转变为游离对象。当游离对象被重新关联到session上时,并再次转变成持久对象。游离对象和比瞬时对象相比,多了一个数据库记录标识值,其它没什么不同。

 

瞬时态:  

典型体现: new()。

由new命令开辟内存空间的java对象,

eg. Person person = new Person(”amigo”, “女”);

如果没有变量对该对象进行引用,它将被java虚拟机回收。

瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,可通过session的save()或 saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象。

持久态:   

典型体现:session.save(object)和session. saveOrUpdate(object)

处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识。如果是用hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联。

当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下。

持久对象具有如下特点:

1. 和session实例关联;n

2. 在数据库中有与之关联的记录。

脱管态:   典型体现:session.delete(object)。

当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。

脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象。

脱管对象具有如下特点:

1. 本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;

2.   比瞬时对象多了一个数据库记录标识值。4RESA3ES  B

 

*  Detached Object(游离对象)有什么好处

Detached Object(游离对象)可以传递到任何层直到表现层而不是用任何DTO(Data Transfer Objects). 然后你还可以重新把游离对象赋给另外一个Session

 

 

*  hibernate中数据表映射关系主要有什么类型?

one-to-many
 inverse:主控方,外键的关系有谁控制
  inverse=false 是主控方,外键是由它控制的   
  inverse=true 是被控方,外键与它没关系
  要想实现主控方的控制必须将被控方作为主控方的属性
 cascade:级联
  主表增从表增
  主表修从表修
  主表删从表删
 lazy:延迟
  lazy=false:一下将所有的内容取出,不延时(常用)
  lazy=true:取出部分内容,其余内容动态去取
  通过get可以取出对方的所有内容

 

Hibernate内置的主键生成策略:

 

     (1)increment:主键按数值顺序递增。

 

     (2)identity:采用数据库提供的主键生成机制。

 

     (3)sequence:采用数据库提供的序列机制生成主键。

 

     (4)hilo:通过高低位算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。

 

     (5)seqhilo:与hilo类似,只是主键历史状态保存在sequence中。

 

     (6)uuid.hex:用一个128bit的uuid算法生成字符串类型的标识符,被编码为一个32位16进制

 

              数字的字符串。

 

     (7)uuid.String:被编码为一个16个字符长的任意ASCII字符组成的字符串。

 

     (8)native:根据底层数据库的能力选择identity,sequence或hilo中的一个。

 

     (9)assigned:手动分配一个标识符。(指定此种策略时不能使用saveOrUpdate()方法,必须明确

 

             指出是save还是update

 

     (10)foreign:外部引用,使用另外一个相关联的对象的标识符。和<one-to-one>联合一起使用。

 

Hibernate中的update()和saveOrUpdate()的区别?

、 saveOrUpdate()方法可以实现update()的功能,但会多些步骤,具体如下:

如果对象在该session中已经被持久化,不进行操作;

对象的标识符属性(identifier property)在数据库中不存在或者是个暂时的值,调用save()方法保存它;

如果session中的另一个对象有相同的标识符抛出一个异常;

以上皆不符合则调用update()更新之。

posted on 2017-12-18 15:56  未来_我来  阅读(434)  评论(0编辑  收藏  举报

2 3
4