Hibernate学习笔记(三)

一、数据库中的表关系

        (一)一对一

        (二)一对多(多对一):在树立关系的时候一对多和多对一是不允许看做相同的,但是在技术实现的时候,这两种都是使用的相同的方法。

        (三)多对多

二、如何确立和实现数据库中的表关系

        (一)一对一的表关系在数据库中如何实现:

                   第一种方式:建立外键的方式

                                        使用外键约束,唯一约束和非空约束

                                        通过把外键约束添加唯一和非空约束来实现表之间的一对一的关系

                   第二种方式:建立主键的方式

                                        让从表的对应字段既是外键,也是主键

        (二)一对多的表关系在数据库中如何实现:

                    使用外键约束来实现

扫描二维码关注公众号,回复: 3112007 查看本文章

                    我们通常习惯吧一的一方称为主表,把多的一方称为从表

                    什么是外键?从表中有一列,该列的取值除了null之外,只能来源于主表的主键,默认情况下外键值是可以重复的

        (三)多对多的表关系在数据库中如何实现:

                    通过中间表来实现

                    中间表有只有两个外键不能有其他的字段,这两个外键就是两个多放的表的主键,且中间表的主键为联合主键

                    任何一个多方的表和中间表都可以称作为一个一对多的关系,但是两个多方的表去掉中间表就毫无关系

        (四)如何确立表之间的关系

                    通过外键来确立

                    A)两张表:看外键是否存在唯一约束和非空约束,如果存在就是一对一,如果不存在或者是不全(只有非空或者是唯一)就是一对多

                    B)三张表:每张多方的表和中间表都是一个一对多的关系

三、学习多表映射配置要遵循的步骤

        (一)确立两张表之间的关系

        (二)在数据库中实现两张表之间的关系建立

        (三)在实体类中描述出两张表之间的关系

        (四)在映射配置文件中建立两个实体类和两张表之间的关系

四、一对多关系映射配置及操作

        (一)在主从表各自的实体类中写好字段,然后在主表实体类中包含从表实体集合的引用,在从表实体类中包含主表实体的对象的引用,并各自生成get和set方法

                    (A)主表包含从表的集合的引用: private Set<从表实体类名称> name = new HashSet<从表实体类名称>(0);

                            因为Set集合在映射时比较方便而List集合在映射时有一些细节的地方需要处理,因此在映射时使用Set集合。Set集合new时会存在一个默认空间的大小,为了减少内存的消耗,要加一个0来确保Set集合初始化时默认空间不开辟。

                    (B)从表包含主表的对象的引用:private 实体类名称 引用名称;

        (二)在各自的配置文件中添加配置信息

                    (A)在从表的配置文件中添加如下信息:

                               涉及标签:many-to-one

                                作用:建立多对一的关系

                                属性:name->从表实体类中引用主表实体类对象的引用名称

                                          class->从表实体类中引用主表实体类对象的名称

                                          column->指定从表中外键的字段名称

                    (B)在主表的配置文件中添加如下信息:

                                涉及标签:set、key、one-to-many

                                作用:set->用于配置set集合配置

                                          key->用于映射外键字段

                                          one-to-many->用于建立一对多的映射配置

                                属性:set中包含的属性:name->指定主表实体类中Set集合的属性名称

                                                                        table->指定从表的名称,在一对多的配置时可以不用写

                                                                        inverse->是否放弃维护关联关系的权利【true:放弃,false:不放弃】

                                           key中包含的属性:column->指定从表中外键字段名称

                                           one-to-many中包含的属性:class->用于指定从表实体类的名称

                    

                        (C)添加操作时,主表或者从表需要添加信息时就按照单表添加来操作,如果主从表都需要同时添加信息时,可以通过配置级联更新来只需要保存任意一张表的信息就可以同时保存主从表的信息,在主表的Set标签或者从表的many-to-one标签上添加cascade属性,属性值为sava-update,delete多个属性值之间用逗号隔开,但是hibernate在执行此操作时产生两条插入数据的命令(先插入主表数据,再插入从表的数据)外,还有一条更新的语句,这是由于在插入主表时,主表实体类中的从表集合引用中的ID没有数据,接着再插入从表的数据时,从表的实体类数据变成了持久态产生了ID值,由于在一级缓存和快照区的存在,从表的实体类中的ID和主表中的从表集合引用中的ID不相同,因此会产生一条更新语句来更新数据库,当然这条更新语句是多余的,此时就需要在主表的配置文件中的set标签里面添加一个inverse属性,此属性用来设置是否放弃维护主从表关联关系的权利,默认值为false,我们通过设置true来选择放弃,然后再执行此操作时就不会产生这条多余的更新语句了。

                        (D)删除操作时,删除从表数据时就按照单表删除来操作,但是主表执行删除操作时,要看有没有从表对主表数据的引用,如果有,如果从表中的外键字段没有非空约束,hibernate会把从表中的外键字段设置为null,然后在删除主表中的数据,如果从表中的外键字段有非空约束,则hibernate不能更新外键字段我null,此时就会报错,如果仍想删除,此时就需要设置级联删除,同时必须配置inverse属性值为true,否则就会失败。如果没有就按单表操作来执行。

                      (E)修改操作时,修改主表操作就相当于单表的操作,修改从表时需要在从表的many-to-one标签上添加cascade属性以及在主表的Set标签中添加cascade和inverse属性

                          (F)查找操作时,使用对象导航查询,对象导航查询就是当两个实习之间有关联关系(一对多、多对一,一对一,多对多)中的任意一种的时候,我们通过getXXX方法就可以实现查询功能(功能是由hibernate提供的)例如:customer.getLinkMans()就可以得到当前客户下所有的联系人,此方法默认为延迟加载,也可以通过配置来改为立即加载,修改情况如下:①根据多的一方查询一的一方时,不需要使用延迟加载,而是使用立即加载,修改方法就是找到多的一方的配置文件,在many-to-one标签中添加一个属性,该属性为lazy,其值有三种,false(立即加载),proxy(看load方法是延迟加载还是立即加载),no-proxy(不管),对于proxy应该如何修改load方法的加载方式呢,首先找到查询的实体类的配置文件,在它的class是标签中也有一个lazy属性,其属性值有true(延迟加载,默认),false(立即加载)。②根据一的一方查询多的一方时,我们使用延迟加载(用的时候再执行操作),这样节省空间。

五、多对多关系映射配置及操作

        (一)在两个表对应各自的实体类中写好字段,然后在两张表对应的实体类中包含从表实体集合的引用,并各自生成get和set方法

        (二)在各自的配置文件中添加配置信息

                                涉及标签:set、key、one-to-many

                                作用:set->用于配置set集合配置

                                          key->用于映射外键字段

                                          one-to-many->用于建立一对多的映射配置

                                属性:set中包含的属性:name->指定主表实体类中Set集合的属性名称

                                                                        table->指定中间表的名称,在一对多的配置时可以不用写,但在多对多中一定要写

                                                                        inverse->是否放弃维护关联关系的权利【true:放弃,false:不放弃】

                                           key中包含的属性:column->指定当前实体在中间表中外键字段名称

                                           many-to-many中包含的属性:class->用于指定对方实体类的名称

                                                                                            column->用于指定另一张表在中间表中的外键名称

        (三)添加数据,如果是单个的向每张表添加数据就是单表操作,如果是向两张表同时插入数据,就需要让其中一张表放弃维护关联关系的维护,如果不放弃就会出现主键重复的错误。

        (四)删除数据,在实际开发中,多对多的双向级联删除是禁止使用的,这样会导致所有有关联的数据全部删除。


猜你喜欢

转载自blog.csdn.net/Yinyaowei/article/details/80765953
今日推荐