hibernate所有的精华都沉淀在面向对象这个思想上,这也是它最出彩的地方。

一、关于多表:
多表是一种关系的表达,具体的有一对多,多对多这两种。

1、一对多关系,如订单和客户,一个订单只能属于一个客户,但一个客户可以有多个
订单

“一”的那一方
1)中的主键作为“多”的一方的外键,对应的,在“一”的实体类中建立private Set<> xx
= new Set<>();其中的泛型是“一”这个对象,在“一”的这一方要用private XX xx;XX
为其主键对象。

2)在“一”的那一方配置
<Set name="Set集合名">
<key column="外键名"/>
<one-to-many class="关联类"/>
</Set>

3)在“多”的那一方配置
<many-to-one name="对象名" column="外键名" class="关联类"/>

2、多对多关系,如课程与学生之间的关系
引用两者的主键作为外键,生成第三张中间表为两者建立起关系.

在两者的实体类中要分别建立对方类的Set集合

在两者的配置文件中,添加以下配置
<Set name="Set集合名" table="第三张关联表名">
<key column="自身主键名" />
<many-to-many class="关联类" column="关联类主键名" />
</Set>

3、inverse属性
inverse本意为反转,这个属性默认值为false,他的作用的表示是否维护外键,false
则为维护,true则为不维护,即反转控制权,在一对多关系中一般由多的那一方来维护
外键,即一的那一方要配置inverse=“true”,反转外键的控制权;
如果是多对多的情况,一定要在任一方设置反转,让一方拥有外键的控制权,不然两
方都维护外键关系就会出现冲突。

4、cascade属性
cascade意为级联操作,默认值为none用值有:

update
save
save-update
delete  
all
none
all-delete-orphan(孤儿删除)

若设置级联为update,那么设置级联属性的一方持久化后,无需再保存关联的另一方
需要注意的是,一般不使用delete和all-delete-orphan,这两个值很危险,一旦误删
会产生严重后果。

二、hibernate检索(查询)

1、最简单的查询:
session.get(对象class,id)-----》通过id查询出对象,此id对应的对象必须
唯一。
 
 2、HQL查询
hibernate query language -----》hibernate的独家查询语言,需要些少量的
sql语句。

1)完全查询:
String hql ="from Xxx对象";
Query query = session.createQuery(hql);
List<Xxx> list = query.list();//返回对象结果集

2)条件查询:
按id查询:
String hql = "from Xxx where id = ?";
Query query = session.createQuery(hql);
query.setParameter(0,“idname”);
Xxx xx = (Xxx)query.uniqueResult();

匿名方式:
Stirng hql = "from Xxx where :id = c_id";
Query query = session.createQuery(hql);
query.setParameter("c_id","idName");
Xxx xx = (Xxx)query.uniqueResult();

3)分页查询
String hql = "from Xxx";
Query query = session.createQuery(hql);
query.setFirstResult(0);//起始索引
query.setMaxResults(2);//查询条数,相当于limit 0,2
索引=(当前页数-1)*查询条数

4)查询总条数
String hql = "select count(*) from Xxx";
Query query = session.createQuery(hql);
int count = (Long)query.iterate().next().intValue();
或写成Number count = (Number)query.uniqueResult();

5)投影查询
String hql ="select xxx属性 from Xxx对象";
Query query = session.createQuery(hql);
List list = query.list();//返回对象结果集

6)投影查询并把结果集给封装成对象
String hql ="select new Xxx(1属性,2属性) from Xxx对象";
Query query = session.createQuery(hql);
List<Xxx> list = query.list();//返回对象结果集
使用这个hql时要确保Xxx对象中提供了相应的构造方法

7)多表查询
|-内连接
|-外连接
|-左外连接
|-右外连接

内连接:
String hql = "from Xxx x inner join x.属性";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();

迫切内连接:
String hql = "from Xxx x inner join fetch x.属性";
Query query = session.createQuery(hql);
List<Xxx> list = query.list();
//直接获得与x.属性连接的Xxx对象

左外连接、右外连接
String hql = "from Xxx x inner left/right join fetch x.属性";
Query query = session.createQuery(hql);
List<Xxx> list = query.list();

三、QBC查询(query by criteria)
无sql语句的查询,完全面向对象

1、全部查询
Criteria c = session.createCriteria(Xxx.class);
List<Xxx> list = c.list();

2、条件查询
Criteria c = session.createCriteria(Xxx.class);
c.add(Restrictions.内置的条件);

3、分页查询
Criteria c = session.createCriteria(Xxx.class);
c.setFirstResult(0);
c.setMaxResults(2);

4、排列查询
Criteria c = session.createCriteria(Xxx.class);
c.addOrder(Order.asc("排序的列名"));
List<Xxx> list = c.list();

5、离线查询
    //在web层创建一个离线criteria对象方便在web层进行条件的拼接
DetachedCriteria dc = DetachedCriteria.forClass(Xxx.class);
dc.add(Restrictions.条件);//拼装好的条件
//dao层将离线查询对象关联到当前session上
Criteria c = dc.getExecutableCriteria(session);
...

四、查询优化

1、懒加载(延迟加载):get()--改为--》load
load方法是在执行时不发送任何sql语句,而是先返回一个对象,
只有在使用该对象时才查询;
而sava方法在执行时就会发送sql语句,无论这个被查询到的对象
使用还是不使用

hibernate精华总结相关推荐

  1. 手低眼高 初学者学习Hibernate的方法

    Hibernate入门容易,掌握精通我也不敢自夸.我第一遍看Hibernate文档的时候也觉得很吃力,但不是因为Hibernate难掌握而感到吃力,是因为Hibernate文档处处都是持久层设计的经验 ...

  2. Spring精华问答 | 为何使用Spring?

    Spring框架是一个开源的Java平台,它提供了非常容易,非常迅速地开发健壮的Java应用程序的全面的基础设施支持.今天就让我们来看看关于Spring的精华问答吧. 1 Q:Spring的目标是什么 ...

  3. Spring精华问答 | Spring 能帮我们做什么?

    Spring框架是一个开源的Java平台,它提供了非常容易,非常迅速地开发健壮的Java应用程序的全面的基础设施支持.今天就让我们一起来看看关于Spring的精华问答吧. 1 Q:什么是Spring框 ...

  4. 基于jsp+mysql+Spring+hibernate+在线学习交流论坛平台

    本项目演示链接地址 > 主要功能模块设计: 管理员角色包含以下功能:管理员登录,发布公告,修改资料,查看新帖,查看精华帖请求,封锁用户,创建讨论区等功能. 用户角色包含以下功能:按分类查看,用户 ...

  5. 基于jsp+mysql+Spring+hibernate+的SSH在线学习交流论坛平台

    本项目演示链接地址> 主要功能模块设计: 管理员角色包含以下功能:管理员登录,发布公告,修改资料,查看新帖,查看精华帖请求,封锁用户,创建讨论区等功能. 用户角色包含以下功能:按分类查看,用户登 ...

  6. iteye上总结的编程精华资源

    原文: http://www.iteye.com/magazines/130 博客是记录学习历程.分享经验的最佳平台,多年以来,各路技术大牛在ITeye网站上产生了大量优质的技术文章,并将系列文章集结 ...

  7. 来自CSDN的精华网址

    来自CSDN的精华网址,包括:WebForm中DataGrid及其它程序员收藏的精华 自认为以下文章比较经典,希望对初学者有用^_^ 1.DataGrid动态模板列更新数据并且分页的例子 http:/ ...

  8. 爱的乐章,Hibernate之三部曲

    爱的乐章,Hibernate之三部曲 摘要 本文介绍了笔者使用Hibernate的三个阶段.第一个阶段完全被Hibernate的优点吸引.第二个阶段发现Hibernate在性能上的一些缺陷.笔者通过实 ...

  9. Struts1、Struts2、Hibernate、Spring框架工作原理介绍

    Struts1工作原理 Struts1工作原理图 1 .初始化: struts 框架的总控制器 ActionServlet 是一个 Servlet ,它在 web.xml 中配置成自动启动的 Serv ...

最新文章

  1. ios 圆形旋转菜单_iOS实现滑动弧形菜单的思路与方法
  2. spring集成xmemcached
  3. opentesty--luasocket 安装
  4. VC6.0编写BHO 提示unresolved external symbol _main
  5. 进程内存信息 /proc/[pid]/maps /proc/[pid]/smaps /proc/[pid]/status
  6. Allegro 光绘文件快速导入
  7. html调用deeplink,如何优雅地从浏览器打开本地应用deeplink
  8. 面试 .NET 开发​,为什么也要考算法?​
  9. linux 编译3g驱动_linux重新编译内核
  10. Path Sum leetcode java
  11. 根据控制点坐标对完成坐标转换
  12. python打开浏览器的三种方法
  13. Java Web 学生选课管理系统
  14. Hive MetaStore java.lang.NoClassDefFoundError: com/facebook/fb303/FacebookService$Iface
  15. 真实世界里的钢铁侠-特斯拉汽车创始人埃隆·马斯克(Elon Musk)
  16. Spire.XLS的使用
  17. python读取加密word_python的特殊文件操作——excel、PDF、word、json、csv
  18. vue PC端项目打包成windows桌面程序
  19. 银行存款对账java代码_银行存款对账方法
  20. 干货 | 软件工程师必知之事 —— 如何定义自己的职业路线?

热门文章

  1. REST-Assured,接口自动化的 “瑞士军刀“- 初识篇
  2. 苹果开发者账号申请流程(公司)
  3. 【saltstack】配置salt-master端REDIS_RETURN
  4. VUE+VSCODE(新建一个项目)
  5. 计算机word资料,怎样快速找到电脑中的Word文档
  6. 艾尔米特插值的MATLAB实现,埃尔米特(Hermite)插值
  7. 随机产生单词java_JavaGUI实现随机单词答题游戏
  8. 深入浅出 - Android系统移植与平台开发(六)- 为Android启动加速【转】
  9. 知名APP(支付宝、微信、花瓣等)首页设计技巧及原型实例讲解
  10. 13、用 k8s 管理机密信息Secret、查看 Secret、volume 方式使用 Secret、环境变量方式使用 Secret、用 ConfigMap 管理配置