首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Hibernate使用总结

2012-07-05 
Hibernate应用总结1.hibernate初始化在hibernate.cfg.xml文件中配置,可根据Demo进行调整。hibernate.show_s

Hibernate应用总结

1.hibernate初始化


在hibernate.cfg.xml文件中配置,可根据Demo进行调整。
hibernate.show_sql为true,显示SQL操作语句。
hibernate.hbm2ddl.auto属性:
? 为create-drop,表示自动创建表和删除表。
? 为update,表示会更新表,但不会删除表。
? 为create,每次自动创建表,如果存在则删除。
示例代码:

?

(3)一对多(例:部门->员工),在部门对象中创建

?

??? IdCard类映射:

?

?? 一对一的另外一种建立关系,则从表有自己的主键ID,并建立一外键与主表关联(需限制为唯一)
?? 例:主表(person)的关联映射需改为

? ?从表(idCard)的关联映射需改为

?

(5)多对多(例老师-学生)
??? 操作和性能不太理想,实际使用中最好转换成一对多的对象模型,创建中间表,转换成两个一对多。
??? 例:Teacher:id,name,studentSet;
????????? Student:id,name,TeacherSet;
??? Teacher表映射:

?

??? Student表映射类似于Teacher.
??? 在更新数据时,只需单方进行set(),双方都进行set更新时会出错。
(6)在session范围外,要获得关联的对象,如果没有配置延迟加载false,则取不到数据,
????? 可用Hibernate.initialize(emp.getDepart()),初始化员工的部门对象。
(7)Cascade用来说明当对主对象进行某种操作时是否对其关联的从对象也进行类似的操作。
?????? 常用的有:none,all,save-update,delete,lock,refresh,evict,replicate,
?????? persist,merge,delete-orphan。一般对<many-to-one>,<many-to-many>不设置级联,
?????? 而在<one-to-one>和<one-to-many>中设置级联。
(8)一对一关系中主对象查询时默认不使用懒加载,使用左外连接查询,而从对象查询时使用懒加载。
(9)fetch是指以什么方式抓取数据,fetch=”join”,通过关联表一次性把数据都查出来,
????? ?懒加载无效,默认情况下都是select.
????? 当使用一对多或多对多时,尽量不设置fetch=”join”,可能会关联多张表,性能差。
(10)Lazy是指什么时候抓取数据,lazy=”false”则懒加载无效,查出所有关联的数据,
????? 默认情况下lazy=”proxy”,即使用对象时才查询。当使用懒加载时,访问代理对象的getId()
????? 和getClass()不会去查询访问数据库。当设置fetch=”join”时,lazy的配置失效,没有意义。

?

13.Hibernate缓存


(1)首先从缓存中取数据,如果不存在则从数据库取数据,然后放入缓存。在更新对象时,将对象从缓存中移除。
(2)一级缓存,属于session级共享,session中存在一级缓存,当session关闭后,一级缓存也就不存在了,
???? 当查找同个对象时,需再次查找数据库。Save,update,saveOrUpdate,load,get,list,iterate,lock
?????这些方法都会将对象放在一级缓存中,一级缓存不能控制缓存的数量,所以要注意大批量操作数据时可能内存溢出,
???? 可以用evict,clear方法清除缓存中的内容。
???? Query()方法每次都从数据库查询,不会从缓存中取数据。
(3)二级缓存,属于sessionFactory级共享,可以被所有的session共享,hibernate二级缓存交给第三方实现,
???? 配置如下:

?方式(二):在具体对象映射文件中配置:

?

???? Usage为使用策略,主要有以下几种方式:
?????? ?1.read-only,在确保对象不修改时使用。
??????? 2.read-write,修改时同步缓存,保证并发读写时正确性,但效率较低。
?????? ?3.nonstrict-read-write,非严格的读写,比第二种方式效率较高,但不考虑并发操作。
?????? ?4.transactional,较少使用,用于事务性控制。
(4)二级缓存的清理,通过sessionFactory.evict()进行清理。
(5)使用缓存的条件:
??? ?1.读取大于修改。
???? 2.数据量不能超过内存容量。
???? 3.对数据要有独享的控制。
???? 4.可以容忍出现无效数据。
(6)StatelessSession接口,是无状态的session,不和一级缓存,二级缓存交互。

?

14.?事务管理


? 事务控制一般应放在三层架构的业务逻辑层。
(1)JDBCTranction,一个SessionFactory对应一个数据库。
(2)JTATranction,跨数据库的事物,由应用JTA容器实现。(tomcat不提供)。
(3)OpenSessionInview,主要解决以下问题:
??? ?1.解决事务问题。事务在过滤器打开,在页面渲染后,执行过滤器后关闭。不在业务层进行控制。
??? ?2.解决懒加载问题。
? ?存在以下问题:
???? 1.一级缓存一直保留到页面渲染后才释放,占用内存较大。
???? 2.数据库连接长时间没释放,并发大操作时有问题。
(4)悲观锁:当读取数据时加上锁,修改提交后释放锁。
(5)乐观锁:给数据库加上版本号进行控制。在hibernate中具体应用如下:
??? ?1.给对象加上版本号.(int型ver属性)
??? ?2.在hibernate中配置。<version name=”ver”/>,也可用
??????? <timestamp name=”ver”/>来控制,但精确度有限。
???? 3.在数据库中加上版本号字段。
???? 4.Hibernate在更新数据时会自动读取版本号和更新版本号,同时读取时后面提交的会报错。

热点排行