Hibernate的学习笔记(4)

前提是你 提交于 2019-12-06 20:20:54

通过前段时间的学习,hibernate的映射关系尤为重要,需要理解的也有挺多的。

1、一对一映射

  1)主键关联。一对一默认使用的是立即加载,如果需要时用延迟加载,那么需要在one-to-one元素中将constrained属性设为true,并且将待加载的一方的class元素中的lazy属性设为true(或者不去设置,因为该属性默认值就是true)。一对一加载默认使用左外连接,可以通过修改fetch属性为select修改成每次发送一条select语句的形式。

  2)外键关联。本质上一对多的蜕变形式。在many-to-one元素中增加unique=”true”属性就变成了一对一。

3mapset 标签中的element子标签映射的是原子类型(stringdate,int,long….),即能够直接映射到数据库表字段上的类型,而one-to-many映射的则是实体类型,指的是无法映射到表的字段,而是要映射到整张表的类型。

4Bag(结合了ListSet),可以重复且没有顺序的一种集合,是Hibernate提供的。

5、查询排序(内存排序及数据库排序)

6、数据库排序使用order-by属性。

7、内存排序使用sort属性,它有两个属性值(unsortednatural),其中的natural指的是按照自然的升序排序。第三个属性值是我们自己定义的排序规则类。

8、内存排序:有两个属性值可以直接使用,分别是unsorted(不排序)以及natural(自然排序,即升序),此外,我们还可以自定义排序规则,方式是定义一个类,让其实现Comparator接口,并且实现该接口中的compare方法,在该方法中实现排序规则即可。然后将该自定义排序规则的类名作为sort的属性即可。

9、联合组建的映射规则

   1)类中的每个主键属性都对应到数据表中的每个主键列。Hibernate要求具有 联合主键的实体类实现Serializable接口,并且重写hashCodeequals方法,重写这两个方法的原因在于hibernate要根据数据库的联合主键来判断两行记录是否是一样的,如果一样那么就认为是同一的对象。这反映到程序领域中就是根据hashCodeequals方法来判断某两个对象是否能都放到诸如Set这样的集合当中。 联合主键的实体实现Serializable接口的原因在于使用get load方法的时候需要先构建出来该实体的对象,并且将查询依据(联合主键)设置进去,然后作为getload方法的第二个参数传进去即可。

2)将主键所对应属性提取出一个类(称之为主键类),并且主键类需要实现Serializable接口,重写equals方法与hashCode方法,原因与上面一样。

10、继承映射

1)每个子类一张表

2)一张表存储继承体系中所有类的信息(数据库表实际上是继承体系中所有类的属性并集所构成的字段

      

需要在hbm文件中增加如下一行:

<discriminator column="personType" type="string"></discriminator>

   3)公共信息放在父类表中,独有信息放在子类表中,每一个子类对应一张表。   

   

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!