个人框架初学者,觉得hibernate的内容多,不多写肯定记不下来,写多了也不一定能信手拈来。所以今天写下一个总结,重温一遍,有需要的可以看看,大概分为:
1.对应关系(一对多 多对一 双向一对多 基于主键1对1基于外键1对1
多对多),小白只会xml配置方式,请原谅
2.缓存(一级缓存,二级缓存,查询缓存,我博客里有相关文章,这里我不写了)
3.HQL方面的靠自己多多练习,这里也没办法写什么。
如果只是需要查询该文章的一个小知识点可以Ctrl+F查询
这里需要的jar包:hibernate 4.0需要的jar包,mysql的jdbc驱动
1.单向多对1,这里我会贴出bean类的字段已经对xml配置文件的部分属性解释
类比:1个人有多辆车,反之多个车的主人是同一个,所以仅需要在Car里添加字段Person
这是car的xml配置文件,Person的配置文件和普通bean类配置文件一样
这里主要讲 最后一个属性<many-to-one></many-to-one>,name对应bean类person属性的属性名,column是即将在该表,本处即hibernate_More2One_car 表增加一列 Person_id用来对应Person表的主键,从而实现单向多对1(Ps:什么为单向,这里 仅个人理解解释一下,hibernate是一个ORM框架,关系对象映射,即对关系的处理,即对表的处理都是通过处理对象来实现关联映射,因为这里是单向的,所以我们仅仅只能使用car类对象获取person的值,而不能通过person获得car)lazy属性 懒加载 属性,默认为false 开始即为proxy,何为懒加载,就是在加载主类对象时,不同时加载属性里的对象属性,这里相当于person属性,只有在需要用到的时候才加载,如果再session关闭后进行加载则会抛出懒加载异常
举个例子,我关闭了懒加载异常,session获得一个car对象,这个时候有2个查询语句,但是如果我开启懒加载,同样获得car只需要1个查询语句,但是当你需要获得person时候又发出一条查询语句,如果你开启了懒加载,但是在session关闭后获取person就会抛出异常(Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session)
2.单向1对多
Car的bean类字段保持不变,改变person
Car和Person的xml配置文件发生一点变换
因为是单向的,所以在Car里删除了many to one,并且在person里配置了set属性
Name对应person字段属性名,key属性是在car对应表里增加一个字段,最后生成的2个表的表结构是和上面多对一的表结构是一样的
3.双向1对多(也叫双向多对1)
Bean类字段不变,xml属性变。Xml的变化有点类似单向的xml配置文件,即Car里要重新配置一个Many to one 然后Person里还要保持Set属性,上图:
这里出现了2个前面没有的属性cascade(级联属性),学过数据库的都知道,级联操作就不讲解了,里面有好几个选项,如delete。inverse控制反转,该属性在后面会出现,当true时,即该关联关系的控制权被反转在另一方,如这里的Person inverse属性设置为true则控制权在Car这边,至于这个控制权是什么意思,我在百度上摘录了一段解释:
(控制权在哪边哪边就得负责维护关系,即代码就需要加入相关的set操作,save-update可以减少相应save代码)
http://lijiejava.iteye.com/blog/776587
PS:一般控制权留在多的一方,可以减少update语句,改善性能!
4.基于外键的1对1
就是在2个关联表里选取一个字段做另一个表主键的外键!
上xml!
生成的表用mysql查看后:
Property-ref这个属性讲一下:
http://blog.csdn.net/fengyuanfa/article/details/5096764
5.基于主键的1对1
Hibernate有自己的主键生成策略 里面就有一个是 foreign策略,根据其他bean类主键生成自己的主键,相当于绑定起来。生成的表结构都是主键一致的。
划线的地方可以看看,其次需要讲的就是constrained这个属性:
http://blog.csdn.net/linminqin/article/details/6324567
有个地方需要提醒下,2个bean的主键字段类型必须一致,否则会抛出异常
6.(基于连接表)多对多
多了一个table属性 是建立用于连接2个表之间的对应关系属性,新表字段为bean类表的主键。其他没什么好讲的。