Hibernate工作原理及为什么要用?
Hibernate工作原理及为什么要用?
读取并解析配置文件
读取并解析映射信息,创建SessionFactory
打开Sesssion
创建事务Transation
持久化操作
提交事务
关闭Session
关闭SesstionFactory
使用Hibernate框架就不用我们写很多繁琐的SQL语句。Hibernate实现了ORM,能够将对象映射成数据库表,从而简化我们的开发!
Hibernate是如何延迟加载(懒加载)?
Hibernate是如何延迟加载(懒加载)?
通过设置属性lazy
进行设置是否需要懒加载
当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。
Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)
Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)
它们通过配置文件中的many-to-one、one-to-many、many-to-many
来实现类之间的关联关系的。
hibernate的三种状态之间如何转换
hibernate的三种状态之间如何转换
Hibernate中对象的状态:
临时/瞬时状态
当我们直接new出来的对象就是临时/瞬时状态的..
这里写图片描述持久化状态
当保存在数据库中的对象就是持久化状态了
这里写图片描述我们来测试一下:当对对象属性进行更改的时候,会反映到数据库中!
session.save(idCard); idCard.setIdCardName("我是测试持久化对象");"我是测试持久化对象");
这里写图片描述
游离状态
当Session关闭了以后,持久化的对象就变成了游离状态了…
这里写图片描述有了上面的基础,我们就很容易说出它们之间的转换了
比较hibernate的三种检索策略优缺点
比较hibernate的三种检索策略优缺点
立即检索:
延迟检索:
迫切左外连接检索:
hibernate都支持哪些缓存策略
hibernate都支持哪些缓存策略
usage的属性有4种:
hibernate里面的sorted collection 和ordered collection有什么区别
hibernate里面的sorted collection 和ordered collection有什么区别
sorted collection
ordered collection
对于比较大的数据集,为了避免在内存中对它们进行排序而出现 Java中的OutOfMemoryError,最好使用ordered collection。
说下Hibernate的缓存机制
说下Hibernate的缓存机制
一级缓存:
二级缓存:
这里写图片描述Hibernate的查询方式有几种
Hibernate的查询方式有几种
如何优化Hibernate?
如何优化Hibernate?
详情可参考资料:
谈谈Hibernate中inverse的作用
谈谈Hibernate中inverse的作用
inverse属性默认是false,就是说关系的两端都来维护关系。
如果表之间的关联关系是“一对多”的话,那么inverse只能在“一”的一方来配置!
详情可参考:
JDBC hibernate 和 ibatis 的区别
JDBC hibernate 和 ibatis 的区别
jdbc:手动
ibatis的特点:半自动化
hibernate:全自动
在数据库中条件查询速度很慢的时候,如何优化?
在数据库中条件查询速度很慢的时候,如何优化?
建索引
减少表之间的关联
优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面
简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据
详情可参考:
什么是SessionFactory,她是线程安全么
什么是SessionFactory,她是线程安全么
SessionFactory 是Hibrenate单例数据存储和线程安全的,以至于可以多线程同时访问。一个SessionFactory 在启动的时候只能建立一次。SessionFactory应该包装各种单例以至于它能很简单的在一个应用代码中储存.
get和load区别
这里写图片描述 这里写图片描述get和load区别
merge的含义:
merge的含义:
详情可参考:
persist和save的区别
persist和save的区别
参考资料:
主键生成 策略有哪些
主键生成 策略有哪些
主键的自动生成策略
指定主键生成策略为手动指定主键的值
指定主键生成策略为UUID生成的值
foreign(外键的方式)
简述hibernate中getCurrentSession和openSession区别
简述hibernate中getCurrentSession和openSession区别
Hibernate中的命名SQL查询指的是什么?
Hibernate中的命名SQL查询指的是什么?
为什么在Hibernate的实体类中要提供一个无参数的构造器这一点非常重要?
为什么在Hibernate的实体类中要提供一个无参数的构造器这一点非常重要?
每个Hibernate实体类必须包含一个 无参数的构造器, 这是因为Hibernate框架要使用Reflection API,通过调用Class.newInstance()来创建这些实体类的实例。如果在实体类中找不到无参数的构造器,这个方法就会抛出一个InstantiationException异常。
可不可以将Hibernate的实体类定义为final类?
可不可以将Hibernate的实体类定义为final类?
你可以将Hibernate的实体类定义为final类,但这种做法并不好。因为Hibernate会使用代理模式在延迟关联的情况下提高性能,如果你把实体类定义成final类之后,因为 Java不允许对final类进行扩展,所以Hibernate就无法再使用代理了,如此一来就限制了使用可以提升性能的手段。
最后
参考资料:
如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y