Hibernate相关资料

摘要

对于大数据量新增、修改、删除操作或者是对大数据量的查询,与数据库的交互次数是决定处理时间的最重要因素,减少交互的次数是提升效率的最好途径,所以在开发过程中,请将show_sql设置为true,深入了解

jdbc、hibernate、ibatis的区别?

Hibernate, Java/J2EE

jdbc:手动
手动写sql
delete、insert、update要将对象的值一个一个取出传到sql中,不能直接传入一个对象。
 select:返回的是一个resultset,要从ResultSet中一行一行、一个字段一个字段的取出,然后封装到一个对象中,不直接返回一个对象。
ibatis的特点:半自动化
 sql要手动写
 delete、insert、update:直接传入一个对象
 select:直接返回一个对象
hibernate:全自动
不写sql,自动封装
 delete、insert、update:直接传入一个对象
 select:直接返回一个对象

Hibernate如何实现数据表映射的继承关系?

Hibernate, Java/J2EE

1、两个表,子类重复父类的属性。
2、一个表,子类父类共用一个表
   <class name=”Users” table=”users”discriminator-value=”Users”>
  <discriminator column=”DISCRIMINATOR_USERTYPE”type=”string”/>
<subclass name=”admin” discriminator-value=”admin”>
          <propertyname=”adminRemark” column=”admin_remark” type=”string” />
       </subclass>
   </class>
3、两个表,子类引用父类的主键,享用公共的字段或属性。
   <class name=”Users”table=”users”>
       <id name=”userid” column=”USERID”type=”string”>
          <generator class=”assigned”/>
       </id>
       <property name=”pwd” column=”pwd”type=”string” />
  <joined-subclass name=”Guest” table=”guest”>
   <key column=”USERID”/>
        <propertyname=”guestRemark” column=”guest_remark” type=”string” />
       </joined-subclass>
</class>
批量删除
Query query=session.createQuery(”update”或”delete”);
query.executeUpdate();

Hibernate中Query对象的使用

Hibernate, Java/J2EE

1 个或多个属性查询:
Query query=session.createQuery(”select customername,customerid fromCustomer”)
List l=query.list();
For(int i=0;i<l.size();i++)
{
Obejct[] object=(Object[])l.get(i);
Object[0]  object[1]
}
}
分组: “select count(*),productname from Product group byproductname order by productname”
取值与属性一样
配置的查询,在*.hbm.xml中
<query name=”sql”>
   <![CDATA[
    from Product where productid=:productid
   ]]>
</query>
Query query=session.getNamedQuery(sql);
联接1
”from Customer as customer join fetch customer.buySet”:将多的放到buySet属性中,得出的结是Customer有一个,Buy有多个
联接2
“from Customer as customer join customer.buySet”:得出的对象,customer与buy是1对1
子查询:
”from Customer as customer where (select count(*) fromcustomer.buySet)>1″

Hibernate中Criteria和DetachedCriteria的作用是什么?

Hibernate, Java/J2EE

Criteria c=session.createCriteria(Customer.class);
//设置条件
c.add(Expression.ge(“字段名”,”值对象”))
 ge:>=
 gt:>
 le:<=
 lt:<
 eq:=
//排序
 c.addOrder(Order.asc(“字段名”))
//分页
 c.setFirstResult(1)//从第2行开始提取
 c.setMaxResults(5)//返回5行

DetachedCriteria产生时不需要session
DetachedCriteria dc= DetachedCriteria.forClass(Customer.class)
Criteria c=Dc.getExecutableCriteria(session)

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

Hibernate, Java/J2EE

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

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

Hibernate, Java/J2EE

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

在myeclipse加入hibernate环境的全过程是什么?

Hibernate, Java/J2EE

1.Db-browers加入配置连接
2.新建工程
3.加入hibernate环境,指定*.hbm.xml及HibernateSessionFactory文件所在的位置

面试中常出现的两个Hibernate面试题及解答

Hibernate, Java/J2EE

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

自己去看http://www.mianwww.com/html/2009/02/2721.html


一些Spring和Hibernate的面试题(附答案)

Hibernate, Java/J2EE, Spring

1、 简述你对IoC(Inversionof Control)的理解,描述一下Spring中实现DI(Dependency Injection)的几种方式。

2、 Spring的Bean有多种作用域,包括:

singleton、prototype、request、session、global session、application、自定义

3、 简单描述Spring framework与Struts的不同之处,整合Spring与Struts有哪些方法,哪种最好,为什么?

4、 Hibernate中的update()和saveOrUpdate()的区别

5、 Spring对多种ORM框架提供了很好的支持,简单描述在Spring中使用Hibernate的方法,并结合事务管理。

答案:

1、好莱坞原则€€€€不要打电话找我,我会打给你的。IoC将创建的职责从应用程序代码搬到了框架中。Spring对Setter注入和构造方法注入提供支持。(详见http://martinfowler.com/articles/injection.html,以及http://www.redsaga.com/spring_ref/2.0/html/beans.html#beans-factory- collaborators)

2、 除application(详见Spring framework 2.0 Reference的3.4节bean的作用域)

3、 Spring是完整的一站式框架,而Struts仅是MVC框架,且着重于MVC中的C。Spring有三种方式整合Struts:使用 Spring 的 ActionSupport 类整合 Struts;使用 Spring 的DelegatingRequestProcessor 覆盖 Struts 的 RequestProcessor;将 Struts Action 管理委托给 Spring 框架,动作委托最好。(详见使用Spring 更好地处理Struts 动作)

Spring 2.0新增一种方式:AutowiringRequestProcessor。(详见http://www.javaeye.com/topic/24239)

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

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

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

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

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

5、 在context中定义DataSource,创建SessionFactoy,设置参数;DAO类继承HibernateDaoSupport,实现具体接口,从中获得HibernateTemplate进行具体操作。

在使用中如果遇到OpenSessionInView的问题,可以添加OpenSessionInViewFilter或OpenSessionInViewInterceptor。(详见Springframework 2.0 Reference的12.2节Hibernate)

声明式事务需声明事务管理器,在context中设置指定属性,用确定和。

请你谈谈SSH整合

Hibernate, Java/J2EE, Spring, Struts

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面试题:什么是SessionFactory?它是线程安全的么?

Hibernate, Java/J2EE

SessionFactory is Hibernates concept of a single datastore and isthreadsafe so that many threads can access it concurrently and request forsessions and immutable cache of compiled mappings for a single database. ASessionFactory is usually only built once at startup. SessionFactory should bewrapped in some kind of singleton so that it can be easily accessed in anapplication code.

SessionFactory sessionFactory = newConfiguration().configure().buildSessionfactory();

优化hibernate性能的几点建议

Hibernate, Java/J2EE

1、针对oracle数据库而言,Fetch Size 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数,一般设置为30、50、100。Oracle数据库的JDBC驱动默认的FetchSize=15,设置Fetch Size设置为:30、50,性能会有明显提升,如果继续增大,超出100,性能提升不明显,反而会消耗内存。

即在hibernate配制文件中进行配制:

1 <property name=”hibernateProperties”>
2 <props>
3 <prop key=”hibernate.dialect”>org.hibernate.dialect.Oracle9Dialect</prop>
4 <prop key=”hibernate.show_sql”>false</prop>
5 <!– Create/update the database tables automaticallywhen the JVM starts up
6 <prop key=”hibernate.hbm2ddl.auto”>update</prop> –>
7 <!– Turn batching off for better error messages underPostgreSQL
8 <prop key=”hibernate.jdbc.batch_size”>100</prop> –>
9 <prop key=”hibernate.jdbc.batch_size”>50</prop>
10 </props>
11 </property>Fetch Size设的越大,读数据库的次数越少,速度越快;Fetch Size越小,读数据库的次数越多,速度越慢。
2、如果是超大的系统,建议生成htm文件。加快页面提升速度。

3、不要把所有的责任推在hibernate上,对代码进行重构,减少对数据库的操作,尽量避免在数据库查询时使用in操作,以及避免递归查询操作,代码质量、系统设计的合理性决定系统性能的高低。

4、 对大数据量查询时,慎用list()或者iterator()返回查询结果,

(1). 使用List()返回结果时,Hibernate会所有查询结果初始化为持久化对象,结果集较大时,会占用很多的处理时间。

(2). 而使用iterator()返回结果时,在每次调用iterator.next()返回对象并使用对象时,Hibernate才调用查询将对应的对象初始化,对于大数据量时,每调用一次查询都会花费较多的时间。当结果集较大,但是含有较大量相同的数据,或者结果集不是全部都会使用时,使用iterator()才有优势。

5、在一对多、多对一的关系中,使用延迟加载机制,会使不少的对象在使用时方会初始化,这样可使得节省内存空间以及减少数据库的负荷,而且若PO中的集合没有被使用时,就可减少互数据库的交互从而减少处理时间。

6、对含有关联的PO(持久化对象)时,若default-cascade=”all”或者 “save-update”,新增PO时,请注意对PO中的集合的赋值操作,因为有可能使得多执行一次update操作。

7、 对于大数据量新增、修改、删除操作或者是对大数据量的查询,与数据库的交互次数是决定处理时间的最重要因素,减少交互的次数是提升效率的最好途径,所以在开发过程中,请将show_sql设置为true,深入了解Hibernate的处理过程,尝试不同的方式,可以使得效率提升。尽可能对每个页面的显示,对数据库的操作减少到100—-150条以内。越少越好。

JDBC,Hibernate 分页怎样实现?

Hibernate, Java/J2EE

答:方法分别为:
1) Hibernate 的分页:
Query query = session.createQuery(”from Student”);
query.setFirstResult(firstResult);//设置每页开始的记录号
query.setMaxResults(resultNumber);//设置每页显示的记录数
Collection students = query.list();
2) JDBC 的分页:根据不同的数据库采用不同的sql 分页语句
例如: Oracle 中的sql 语句为: “SELECT * FROM (SELECT a.*, rownum r FROM
TB_STUDENT) WHERE r between 2 and 10″ 查询从记录号2 到记录号10 之间的
所有记录

关于hibernate的几个面试题

Hibernate, Java/J2EE

1)在hibernate 中,在配置文件呈标题一对多,多对多的标签是什么;
2)Hibernate 的二级缓存是什么;
3)Hibernate 是如何处理事务的;
答:1)一对多的标签为<one-to-many> ;多对多的标签为<many-to-many>;
2)sessionFactory 的缓存为hibernate 的二级缓存;
3)Hibernate 的事务实际上是底层的JDBCTransaction 的封装或者是JTA
Transaction 的封装;默认情况下使用JDBCTransaction。
State
No
State
Name
GD 广东
LN 辽宁
SD 山东
NMG 内蒙

Hibernate 有哪5 个核心接口

Hibernate, Java/J2EE

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

如何优化Hibernate?

Hibernate, Java/J2EE

1. 使用双向一对多关联,不使用单向一对多
2. 灵活使用单向一对多关联
3. 不用一对一,用多对一取代
4. 配置对象缓存,不使用集合缓存
5. 一对多集合使用Bag,多对多集合使用Set
6. 继承类使用显式多态
7. 表字段要少,表关联不要怕多,有二级缓存撑腰

说下Hibernate的缓存机制

Hibernate, Java/J2EE

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

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

Hibernate, Java/J2EE

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

Hibernate是如何延迟加载?

Hibernate, Java/J2EE

1. Hibernate2延迟加载实现:a)实体对象  b)集合(Collection)
2. Hibernate3 提供了属性的延迟加载功能
当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。

hibernate数据查询的几种方式

Hibernate, Java/J2EE

1.使用主键id加载对象(load(),get());

2.通过对象导航,比如通过stu.getTeam()得到team的实例;

3 使用hql;

4使用qbc(query by criteria)

5直接使用sql语句取得记录集;

一般都使用后面三种方式.

注意.hql是面向对象的查询.语法和sql是基本一样的.不区分大小写的,但是注意的是对与对象.必须遵循对象的大小写.因为hql是对像查询..同时我们必须清楚.hql只能取得对象,而不支持uid(update,insert.delete)

…………………………………….(具体的讲解详见查考书)

小结:

hql功能很强大,适合各种情况,但是动态条件查询构造起来很不方便.

criteria 最适合动态查询,但不太适合统计查询,qbe还不够强大.只适合简单的查询.

nativesql可以实现特定的数据库的sql.但是可移植性并不好.

针对web应用来说,大部分常规查询都是动态条件查询,所以首先criteria,并且h 3提供的detachedcriteria,可以在web层构造好detachedcriteria再进入session执行查询.但是涉及到统计查询和非常复杂的关联查询.criteria就无能为力了.这种情况下选择使用hql.最后如果涉及到使用某些数据库的特性的时候,就只有选择 nativesql了.

hql常用来进行实体检索.这个时候要注意返回的list中的元素是实体还是实体数组.如果hql进行实体属性查询,当查询两个以上的属性时,list中的元素就是属性数组了.

qbc最大的用途在与动态查询.它不会忽略配置文件中的预先抓取策略.

使用本地sql检索必须检索对象的所有属性.

Hibernate中:不看数据库,不看XML文件,不看查询语句,怎么样能知道表结构?

Hibernate, Java/J2EE

看表结构对应的类文件,比如UserInfo表对应的UserInfo.java文件




IT家园
IT家园

网友最新评论 (0)