Hibernate

来源:互联网 发布:现在开淘宝网店赚钱吗 编辑:程序博客网 时间:2024/06/06 09:42
一、什么是 Hibernate
hibernate是一个基于ORM持久框架,可以让程序员以面向对象的思想操作数据库,提高生产效率。

二、什么是ORM
orm是一种思想,意思是对象关系映射(Object Relation Mapping)。是对象关系模型,如hibernate,让你以面向对象的方式去编程。封装了JDBC。

三、说一下orm与jdbc的区别?
jdbc只是一个java操作数据库的规范接口而已
orm是一种思想,意思是对象关系映射(Object Relation Mapping)让你以面向对象的方式去编程。封装了JDBC。

四、谈谈MyBatis 和 hibernate 的区别
从mybatis 或 hibernate 的优缺点
和hibernate、及jdbc的比较着手

都是持久层的框架
hibernate是 实体和表的映射
mtbatis是sql语句和dao层接口的映射
Hibernate是面向对象的思想操作数据生成Sql语句,而mybatis是以纯sql操作数据
相对于mybatis容易优化.扩展性好,但是移植性差。

五、jdbc、mybatis 和 hibernate 之间的优缺点比较
http://blog.csdn.net/wangpeng047/article/details/17038659

1、jdbc:
学习简单、代码繁琐、开发慢、手工处理结果集、不易于数据库移植
2、hibernate:
优点:开发速度快,面向对象的操作方式,如save、delete、update方法,自动建表,有HQL语句、动态条件查询(Criteria Query)
也可以直接使用sql,方便移植。
缺点:学习曲线比较长,难度比较大,灵活应用比较困难,效率比JDBC和Mybatis差。
3、myBatis:
优点:
1)学习曲线短、灵活
2)sql全部写在xml文件中,便于管理和优化
3)可以写动态sql 
缺点:
1)编写sql工作量大
2)不易于数据库移植
3)查询出结果集后,如果列名和属性不匹配,必须手工组装

六、HQL和SQL的区别
HQL是面向对象的

、hibernate中什么时候使用sql
常用于统计分析的功能,或者复杂查询中。

八、hibernate中常见的动态查询(Criteria Query)
分页方法,排序方法,模糊查询

例如:查询前50条记录
Criteria crit = sess.createCriteria(Cat.class);//创建啊查询对象
crit.setMaxResults(50);//再调用查询方法
List cats = crit.list();//list方法把查询结果转换成对象
还有eq,like,isNull,in方法等

九、hibernate的主键生成策略
identity:主键自增成长,只能用在支持自动增长的字段数据库中使用,如MySQL
sequence:序列,只能在支持序列的数据库中使用,如Oracle。
native:数据库中设置的方式,例如MySQL使用identity,Oracle使用sequence
uuid:用一个特殊的算法生成一个时空上唯一的字符串。
    包括网卡地址、当前时间、随机数等,标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)
assigned:人工分配
    如需进一步描述,参考《面试笔试宝典》P213页

十、hibernate中get和load的区别
load是延迟加载,检索不到记录抛出异常(ObjectNotFoundException)
get是立即加载,检索不到记录返回null值

十一、hibernate映射文件中<hibernate-mapping> inverse属性和cascade属性的区别
inverse:在双向关联的设置中,设置对方为主控方,对象之间的关联关系由主控方进行维护。
作用:提高sql的执行效率,避免重复的执行修改关联关系的sql语句
cascade:级联更新、级联删除

十二、hibernate的延迟加载(懒加载)
我们所说的懒加载也被称为延迟加载,它在查询的时候不会立刻访问数据库,而是返回代理对象,当真正去使用对象的时候才会访问数据库。
如何配置延迟加载?在映射文件中配置 lazy属性,“true”表示使用延迟加载,“false”表示不使用延迟加载。
在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少系统资源的消耗,这时Hibernate用懒加载机制来弥补这种缺陷。

十三、hibernate的缓存
一级:session级别的缓存,不能关闭
二级:跨session(或SessionFactory级别)的缓存。可以被启用或关闭。但会引起并发问题。要采用事物隔离机制。
一级缓存会一直存在,可以使用 clear()方法 或 flush()方法强制清空
二级缓存 一定要配置定期清空的策略。

一级缓存的使用场合:当查询数据时,首先在session范围内查询数据缓存是否存在,若存在,直接返回,否则取数据库中查询,并将查询结果缓存。
缺点:存放在session范围中,所以生命周期较短。线程不安全,不能够线程共享。
二级缓存的适用场合:当查询数据时,首先在session范围内查询数据缓存是否存在,若不存在,接着在二级缓存中查找,最后才去数据库中查找。

hibernate的二级缓存属于第三方插件。

十四、hibernate常用的二级缓存的插件(第三方缓存)
EHCache、OSCache 等

十五、什么样的数据适合放在二级缓存中
1、不经常被修改的。
2、数据量较小。
3、没有并发问题的数据(不会被大量请求共享)。

十六、hibernate和mybatis的缓存的区别
hibernate有更好的二级缓存机制,可以使用第三方缓存。
MyBatis本身提供的缓存机制不佳,配置不好会出现数据脏读的情况。
hibernate的二级缓存配置在sessionFactory中
mybatis的二级缓存可以针对每个表配置

十七、hibernate的事物处理的注解@Transactional,放在类上和放在方法上有什么区别
注解放在类上,类中的所有方法都应用这个注解。
注解放在方法上,只有这个方法应用这个注解。

十八、hibernate中的锁悲锁和乐观锁
这个问题涉及到数据并发的问题
悲观锁顾名思义就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次都会上锁,并发性很差。
乐观锁顾名思义就是很乐观,每次去拿数据的时候都认为别人不会修改,所以每次都不会上锁。但是在做数据更新的时候会判断有没有其他人更新了这个数据,如果有就上锁。并发性相对较好。
乐观锁适用于写比较少的情况下,这样可以省去了锁的开销,并发性好。
写比较多的情况,用悲观锁就比较合适。
hibernate中的实现方式:
http://www.cnblogs.com/otomedaybreak/archive/2012/01/27/2330008.html
原创粉丝点击