hibernate面试题2

来源:互联网 发布:talkback是什么软件 编辑:程序博客网 时间:2024/05/01 13:33

 hibernate 面试题小集

1. Hibernate有哪几种查询数据的方式

3种:hql、条件查询QBC(Query By Criteria)、原生sql (通过createSQLQuery建立)

2. 谈谈Hibernate中inverse的作用

inverse属性默认是false,就是说关系的两端都来维护关系。
比如Student和Teacher是多对多关系,用一个中间表TeacherStudent维护。Gp)i
如果Student这边inverse=”true”, 那么关系由另一端Teacher维护,就是说当插入Student时,不会操作TeacherStudent表(中间表)。只有Teacher插入或删除时才会触发对中间表的操作。所以两边都inverse=”true”是不对的,会导致任何操作都不触发对中间表的影响;当两边都inverse=”false” 或默认时,会导致在中间表中插入两次关系。

3. 说说Hibernate中的update()和saveOrUpdate()的区别,session的load()和get()的区别。

saveOrUpdate()方法可以实现update()的功能,但会多些步骤,具体如下:
如果对象在该session中已经被持久化,不进行操作;对象的标识符属性(identifier property)在数据库中不存在或者是个暂时的值,调用save()方法保存它;如果session中的另一个对象有相同的标识符抛出一个异常;以上皆不符合则调用update()更新之。
Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。session的get()和load()其区别在于:
如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException;load方法可返回实体的代理类实例,而get方法永远直接返回实体类;load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。

*  hibernate中对象的三种状态

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

瞬时态

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

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

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

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

持久态

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

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

持久对象具有如下特点:

1. 和session实例关联;n

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

脱管态

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

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

脱管对象具有如下特点:

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

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

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

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

*  JDBC hibernate 和 ibatis 的区别

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

*  hibernate如何实现数据表映射的继承关系

1、两个表,子类重复父类的属性。
 2、一个表,子类父类共用一个表
    <class name=”Users” table=”users” discriminator-value=”Users”>
   <discriminator column=”DISCRIMINATOR_USERTYPE” type=”string”/>
<subclass name=”admin” discriminator-value=”admin”>
           <property name=”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”/>
         <property name=”guestRemark” column=”guest_remark” type=”string” />
        </joined-subclass>
</class>
批量删除
 Query query=session.createQuery(”update”或”delete”);
 query.executeUpdate();

*  hibernate中Query对象的使用

1 个或多个属性查询:
 Query query=session.createQuery(”select customername,customerid from Customer”)
 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 by productname 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(*) from customer.buySet)>1″

*  hibernate中Criteria和DetachedCriteria的作用是什么?

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中数据表映射关系主要有什么类型?

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

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

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

*  MyEclipse加入hibernate的全过程是什么

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

原创粉丝点击