Hibernate 映射及查询

实体类和实体之间的关系:一对多,多对多

数据库设计:e_r 一个实体对象就是一个表格,  如果是1对多的关系,将多方的主键拿到1方做外键。  多对多:重新建立一张新的表格,将双方的主键拿到这里做外键

1、一对多的关系映射。

班级和学生为例:

1、创建班级实体类和学生实体类

2、在班级实体类中用set集合属性来表示班级中有多个学生。

3、在学生实体类中,用班级属性来表示这个学生属于哪个班级

4、在映射文件里面:班级(一方)通过《set》标签来描述我的set属性,然后再set标签里面通过<key>开表示我的主键在多方做外键的时候 外键的名称。再用<one-to-mang>标签来制定我和谁是这个关系,将来hibernate会自动将我的主键放到这个类对应的表格里面做外键,外键字段名就是key标签制定的哪个。

5、在映射文件里面:学生(多方)通过<mang-to-one>来表示我和class属性表示那个类是这个关系,同时用column 来制定对方如果要将主键放到我这里做外键,那么外键的名字就是column制定的哪个。

一对多的级联保存:将班级和学生的关系在代码里面体现完成后,只保存班级信息,那么学生信息也一并保存进去,不用单独写代码去保存学生对象。 需要配置

有1个班级对象,这个班级对象里面有三个学生,现在我要把这四个对象统统保持到数据库里面。

Session.save()

一对多的级联删除:

找到要删除的实体对象,直接删除,他下面的学生实体对象一并会被删除。

一对多的修改:

将李四(2)这个对象调到理工班级(3)

Session获得李四中个对象,获得理工班级对象。把李四加到理工班级对象的set集合里面,更新数据库。

2、多对多关系的映射

课程和学生的例子

创建两个实体对象,分别在这两个实体对象里面维护他们之间的多对多的关系,

在映射文件中配置好。

级联保存:出现了一个重复的主键错误。多对多关系是有第三表来维护,创建的时候是有映射文件去配置创建的,没有给他制定主键,那么会把两个外键看作是主键(联合主键)。

在hibernate里面关系的一个维护使由两个对象共同完成的,是双向维护的一个关系,保持学生他会将学生和课程的关系保持到我们的第三个表格里面,去保存课程课程的时候,课程也要去讲关系保存到第三张表格。

如何解决:就是让其中一方放弃对第三张表格的一个维护:<set      inverse=”true”>

级联删除:我删除某个学生,那么和这个学生有关系的课程也会被删除。(一般不会在开发过程中使用)

多对多关系如何维护第三张表格:让张三不选修ssh

单表查询(基本查询)

HQL的基础语法

语法和sql语法基本相同。

和sql语句的一个区别:操纵对象不同。

HQL语句是被Query这个对象使用的。

1、HQL查询所有: from  实体类的名称:

2、HQL的条件查询:from 实体类名 where 实体类属性名=

3、排序查询: order by 属性 asc

4、分页查询:rownum+字查询  不同数据库实现分页的手段不一样。Query对象里面封装了两个方法去实现分页。

5、查询实体对象的部分属性:select 属性名,属性名 from 类名在HQL语句的select后面不允许跟着*  :from 类名:

6、聚合函数的使用 :select count(*) from  类名

QBC查询

借助于Criteria对象进行查询:不需要写任何语句,直接使用它封装的方法来完成查询。

1、查询所有:list();

2、条件查询:使用封装的方法:add(条件)  Restrictions进行条件的设置。

3、排序: criteria.addOrder(Order.asc("sid"));

4、分页:criteria.setFirstResult(0); criteria.setMaxResults(3);

5、统计:criteria.setProjection(Projections.rowCount());

限制条件:Criteria、Query只能是在session对象产生之后,再产生。Criteria因为所有的功能都是有方法来执行,因此这个对象所查询的条件只有在产生session之后才能进行添加。

万一我 有一个需求:要求在页面阶段就得把条件拼接好,那么Criteria对象没有办法完成这个需求:另外一个对象:DetachedCriteria对象可以完成:这个对象可以独立产生,不需要借助任何session,因此使用这个对象进行的查询我们称之为:离线查询.

离线查询

借助于:DetachedCriteria:和Criteria的查询方法都一致。唯一不同就是可以离线生成。

HQL多表查询

内联接:符合条件的行出现在结果集,不符合的不出现

// 查询班级里面有哪些学生

From MyClass m inner join m.stuSet

查询的结果是一个一个小数组

如果要求返回的结果是对象形式的,那么使用迫切内联接:

迫切内联接:

From MyClass m inner join fetch m.stuSet

左外链接:不管是否符合条件:主表里面的记录一定会出现在结果集里面。

From MyClass m left join m.stuSet

From MyClass m left join fetch m.stuSet

f

右外链接(没有迫切)

From MyClass m right   join m.stuSet

检索策略

1、立刻查询:只要执行到我的查询指令,hibernate立刻发送sql指令到数据库吧相应的内容查询出来:get ()就是一个立刻查询的方法

2、延时查询:load():这个方法不会立刻查询数据,只有到不得不去查的时候才去查询。如要获得这个对象里面的主键的话,load方法直接将第二个参数返回给你。只有不得不去查询的时候才发送sql去查。

延时分为两类:

1级别类型的延时:根据id查询类,并且使用时load方法,不会发送sql指令。

2 关联延时:查询班级,如果要班级里的学生信息,那么这个学生信息的查询时机(立刻执行还是延时执行)

Hibernate 默认给我们做了一个优化策略,我查询班级的时候,不会立刻将学生的信息查询出来,当你真的要获得当前班级的学生的时候,hibernate会自动发送sql,将属于这个班级的学生信息查询出来。

可以通过在〈set>设置加载方式  fetch="select" lazy="true"

极其懒惰的加载方式:如果你要查询这个班级的学生的名字,那么这个加载方式只会发送sql指令将学生姓名查询出来。

时间: 2024-07-30 10:11:47

Hibernate 映射及查询的相关文章

Hibernate 映射关系

映射组成关系 •建立域模型和关系数据模型有着不同的出发点: –域模型: 由程序代码组成, 通过细化持久化类的的粒度可提高代码的可重用性, 简化编程 –在没有数据冗余的情况下, 应该尽可能减少表的数目, 简化表之间的参照关系, 以便提高数据的访问速度 •Hibernate 把持久化类的属性分为两种: –值(value)类型: 没有 OID, 不能被单独持久化, 生命周期依赖于所属的持久化类的对象的生命周期 –实体(entity)类型: 有 OID, 可以被单独持久化, 有独立的生命周期 •显然无法

02.Hibernate映射基础

前言:Hibernate的核心功能是根据数据库到实体类的映射,自动从数据库绑定数据到实体类.使我们操作实体类(Java对象)就能对数据库进行增.删.查.改,而不用调用JDBC API使数据操作变得简单而不繁琐.本文就主要讲解Hibernate的映射文件的映射机制,但本文讲解的重点在于通过Hibernate如何配置实体类到数据库表的映射,至于数据库表(或实体类)之间的各种关联关系的映射会在后面的文章中讲到. 1.映射配置文件基础(XXX.hbm.xml) 说明:本节只是对Hibernate的映射文

hibernate框架之-查询结果集返回类型

Hibernate支持HQL和SQL的查询,返回结果支持POJO类型或字段/数组的形式. 开发中用Hibernate进行数据库查询,用的是SQL.原来需要查询一个表的几乎所有字段,所以我使用了addEntity方法,将查询结果转换为映射的对象.后来需求变更,需要查询另外几个表的若干字段,不想继续用addEntity绑定新加的表(毕竟只有几个字段需要查询出来,将多余的字段都转换成映射对象,或只将需查询的字段转换为映射对象,从维护角度来说似乎都不太好),网上查了查:于是在addEntity后再使用a

Hibernate六 HQL查询

HQL查询一 介绍1.HQL:Hibernate Query Language,是一种完全面向对象的查询语言.使用Hibernate有多重查询方式可供选择:hibernate的HQL查询,也可以使用条件查询,甚至使用原生的SQL查询语句.Hibernate还提供了一种数据过滤功能,这些都用于删选目标数据.2.查询步骤:(1)获取Hibernate Session对象(2)编写HQL语句(3)以HQL语句为参数,调用Session的createQuery()方法创建查询对象(4)如果HQL语句包含

hibernate映射的 关联关系:有 一对多关联关系,一对一关联关系,多对多关联关系,继承关系

hibernate环境配置:导包.... 单向n-1:单向 n-1 关联只需从 n 的一端可以访问 1 的一端 <many-to-one> 元素来映射组成关系: name: 设定待映射的持久化类的属性的名字 column: 设定和持久化类的属性对应的表的外键 class:设定待映射的持久化类的属性的类型 建立1所对应的封装类,这儿只写属性,setter和getter就不写了: private Integer customerId; private String customerName; 建立

【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)

上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向:一端只能加载另一端,不能反过来. 双向:两端都可以加载另一端. 问题来了:如何我们想从身份证端(IdCard)加载人(Person),怎么办呢? 下面我们开始介绍一对一的双向关联映射. 映射原理 双向关联映射与单向关联映射的原理是一

hibernate映射文件property常用属性

<property>常用属性name:映射类属性的名字column:对应数据库表的字段名 默认值为属性名 type:字段的类型 update:update操作时是否包含本字段的数据 默认值为true (设置为false则hibernate执行update语句时会把这个 字段忽略)insert:insert操作时是否包含本字段的数据 默认值为true (设置为false则hibernate执行insert语句时会把这个 字段忽略)formula:定义一个SQL来计算这个属性的值 access:H

使用hibernate原生sql查询,结果集全为1的问题解决

问题如下: String sqlTest ="select summary,summaryno from F_Summary"; List<Map<Object, Object>> listTest = this.getService().getListBySql(sqlTest); for (Map<Object, Object> m : listTest) { for (Object k : m.keySet()) { System.out.pr

hibernate的各种查询

Hibernate Query Language(HQL)Criteria QueryNative SQL下面对其分别进行解释select子句:有时并不需要取得对象的所有属性,这时可以使用select子句进行属性查询,如select s.name from Student s.例: void HQLselectDEMO()    {        TRegister user = new TRegister();        Session session = HibernateUtil.cu