hibernate基础问题整理

1 inverse和cascade的区别?
inverse用在双向关联中。两对象的关联关系,由设置inverse=\"true\"的一方去维护。(一般在一对多中,在many的一方把inverse设置为true)。
cascade设置级联属性,在更新一个对象时候,是否级联更新与其相关的对象。

 

2 HQL查询,返回什么样的数据结构?
返回的是list。其中存放了object对象或者object[]数组。
查询整个对象,即\"from Object where ...\" 的形式,list中存放的是object.
查询对象的几个属性,即\"select o.id, o.name, o.birthday form Object where ...\"的形式,list中存放的是object[]数组。

 

3 在HQL的select子句中使用统计函数:

List list=session.createQuery(select count(*),min(user.age) from TUser as user).list(); Iterator it = list.iterator(); while(it.hasNext()){ Object[] results = (Object[]) it.next(); //int total =results[0]; //int minage=results[1]; System.out.println(results[0]); System.out.println(results[1]); }

 

4 hibernate中数据加载方式由哪几种?
由立即加载,延迟加载,预先加载,批量加载等方式。
立即加载(Immedate Loading):加载一个对象,hibernate立即加载其关联对象。
延迟加载(Lazy Loading):加载一个对象,其关联对象并不立即加载,而是在要使用关联对象时,再加载该关联对象。
预先加载(Eager Loading):通过outer-join完成对关联数据的加载。
批量加载(Batch Loading):
<class name=\"TUser\" table=\"T_USER\" batch-size=\"5\"/>

 

5 hibernate中对象有哪几种状态?
临时态:new一个对象,和hibernate并无关联。
持久态:对象和hibernate的session有关联,并且处于session的有效期内。session.delete(object)使一个持久态对象进入临时态。
托管态:持久态的对象,在session关闭之后,就进入托管状态。和临时态对象不同,托管态对象在数据库中包含了相应主键的记录。

 

6 hibernate的session级的缓存,由SessionImpl类来实现,该类维护了一个Map数据类型。保存了与当前session相关联的对象及其状态。内部缓存通常由hibernate自动维护,我们也可通过以下方法手动干预: session.evict 删除session中某个指定对象。 session.clear 清空session内部缓存。

 

7 hibernate中,session和transaction的关系?
我们知道hibernate只是JDBC轻量级的封装,所以hibernate本身并不具备事务管理能力,在事务管理层,hibernate委托jdbc或jta来实现。
若采用jdbc的事务管理,transaction不能跨session. 事务周期限于session周期。
机制如下:

session=SessionFactory.openSession(); //hibernate初始化数据库连接,同时将AutoCommit置为false Transation tx=session.beginTransation(); ... tx.commit();
若采用JTA的事务管理,transation是能跨session的。 这时事务的生命周期由JTA container维护

 

8 hibernate中,什么是悲观锁定和乐观锁定?
悲观锁定依赖底层数据库提供的锁机制实现,在数据处理过程中,使数据库处于锁定状态。
乐观锁定往往通过检查数据版本或字段的变动来实现,并不锁定整个数据库。在性能上要大大优于悲观锁定。
悲观锁定语句:session.lock; Critera.setLockMode; Query.setLockMode;
乐观锁定通过配置文件中class的optimistic_lock=\"version\"来实现。

 

9 hibernate的配置文件中,元素property有个formula属性可指定一个sql表达式,该表达式可以引用表的字段,调用sql函数或者包含子查询语句。例如

<property name=\"unitPrice\" formula=\"BASE_PRICE*QUANTITY\"> ,又如: <property name=\"sumSubjects\" type=\"int\" formula=\"(select count(*) from tb_diary_subject t where t.diaryId=id)\" >

再如:

<property name=\"ContentAbstract\" type=\"string\" size=\"300\" formula=\"select left(diaryConstent) from tb_diary t where t.diaryContent=id\" >

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值