1.Hibernate中集合的使用说明
(1).list集合的使用
部门实体:

对应的映射文件:

当实体中使用了list集合时,因为list有排序功能,所以业务不需要排序时,使用的list的如上配置时,就会对性能有所损耗,在hibernate中提供了list的另一个配置标签<bag>,配置这个标签后,则可取消排序功能。<bag>标签必须与list一起使用。配置如下:

员工实体

对应映射文件:

(2).使用Map集合
部门实体

对应的映射文件

2.Hibernate中级联的配置

One-to-many中配置级联:

One-to-One中配置级联:

3.Hibernate中的inverse:

举例解释:
1.当没有使用inverse这个配置属性时,所有的关系维护必须由程序员写程序自己去维护,比如:部门和员工例子来说:

当按照上面的方法保存部门和员工时,没有配置inverse时,程序运行时,告诉部门有哪些员工,也就是对应的depart.setEmSet(emSet),执行,hibernate会发出一个update的sql来更新一下数据库,但是当执行上面的语句,告诉员工自己属于那个部门的时候,对应的语句是:em1.setDepart(depart);hibernate也会发出一个updatesql来更新数据库,这样做的话,会造成多此一举,从而造成浪费。当在one的一方配置inverse=”true”时,one的一方将不会再维护关联关系,当执行depart.setEmSet(emSet)时,hibernate将不会发sql。
可以通过控制台来看hibernate发出的sql语句:
没有配置inverse的情况:

当配置之后one的一方将不在维护关联关系:

Inverse一般配置在one的一方,让多的一方去维护关联关系,inverse的配置如下:

Inverse属性在集合中才可以配置,并且在list中不能配置。
3.继承
1.整个继承树映射到一张表

继承实现之后的数据库表如下图:

这样做的好处是:单表操作,性能上比较有优势。
缺点:数据库表中有好多字段是空的,按严格来说,这样不规范。
Java代码和对应的映射文件:
1>.People类:

2>.Skiller类:

3>.Sales类:

对应的映射文件:
说明一点:配置文件中的鉴别器如果不指定类型的话,默认是String类型,值为类的全名

2.每个类映射到一张表

继承之后在数据库中对应的表如下:



这样做的优点:表中的字段没有空的
缺点:在查询的时候,需要进行关联查询,这样的话,在效率上会有所下降。
Java代码和对应的映射文件:
实体的java代码和上面的一样没有变化;
映射文件有所变化:

3.鉴别器与内连接(单独生成一张表)相结合

对应的数据库中的表:


Java代码和对应的映射文件
Java代码,没有变化;
。。。。。。
映射文件:

4.每个具体类映射一张独立表

说明一下:如果,people是抽象类将不会生成表,在映射文件中配置abstract="true"

生成的数据库表:



Java代码和映射文件:
Java代码没啥变化;
映射文件:

4.懒加载

5.缓存

Session关闭之后,缓存消失。(意思也是,一级缓存只能存在同一个session中)


网友评论