1. 懒加载问题
当我们检索一个对象时,在默认情况下返回的致使该对象的普通属性,当用户使用对象属性时,才会向数据库中发出一次使用,这种现象称之为ilazy现象
其中在hibernate查询有两种的解决方案,分别是get()和load(),而load()拥有懒加载的特性。它的好处就是可以减少程序本身因为与数据库频繁的交互
造成的处理速度缓慢。
解决方案: 1.显示初始化Hibernate initized(代理对象)
2.修改对象关系文件 lazy改写为lazy=false
3.通过struts2的过滤器(web项目)openSessionInView()
在这里我只是简单的提一下,网上也有很多关于懒加载的问题,例如: http://blog.csdn.net/aspdao/article/details/5472955
2. 级联操作 当进行某个操作的时候,由hibernate自动完成
例如:当删除一个部门的时候,部门里的职员也不在存在
配置文件中
Java代码中
演示级联操作的 save-update
在配置文件中
在Java代码中
一般将cascade配置在one-to-many(one的一方)和one-to-one(主对象的一方)
3.缓存机制
一级缓存原理(Session缓存):当数据库中找到相应的数据,则放入一级缓存。在session作用域中如果再次查找到这条数据就直接从session中查找这条数据
一级缓存的细节问题:
3. 1. 什么操作向一级缓存中放入数据:
save、update、saveOrUpdate、load、get、lis、iterate、lock等操作
3.2.什么操作会直接从一级缓存中取数据 Get、load、list
Get/load会首先从一级缓存中取,如没有再有不同的操作。(get会立即相数据库中发请求,而load会返回一个代理对象,直到用户真正去使用该数据,才会向数据库 中发送请求)
3.3一级缓存不需要配置,它本身没有保护机制,所以我们要进行使用evict或者clear来清除session缓存(evict清除session中一个对象,clear清除session中所有对象)
3.4当session关闭的时候,一级缓存也就没有了。
4.二级缓存(sessionFactory级缓存)
因为一级缓存内存有限或者生命周期有限(SessionFactory的生命周期范围大),所以需要二级缓存来补充一级缓存存在的问题
4.1.需要进行配置
4.2 二级缓存交给第三方处理,常见的有hashtable、OSCache、EHCache
4.3二级缓存的对象可能存放在内存中,也可以存放在硬盘中