[关闭]
@HUST-SuWB 2015-05-24T10:21:57.000000Z 字数 2999 阅读 345

Hibernate实战总结

项目实战


简介

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。常被用于在JavaEE架构中完成数据持久化的重任。

属性介绍

Hibernate的官方手册上有完整的属性介绍,见P32P41
或者也可以看这里

数据加载方式

在传统的JDBC操作中,我们通过SQL语句加载数据进行操作。当SQL语句提交之后,这些数据就被读取待用。但是在Hibernate的世界里,数据(针对关联数据)就有了多种加载方式

主键生成策略

缓存

缓存是数据库数据在内存中的临时容器,它包含了库表数据在内存中的临时拷贝,位于数据库与数据访问层之间。而Hibernate的缓存分为两个层次:内部缓存(session层)和二级缓存(sessionFactory层)。缓存主要在以下两种情况下发挥作用:通过主键id加载数据时以及延迟加载时。

事务管理

事务的四个特性

  1. Atomic:原子性
    事务中包含的操作被看作一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。
  2. Consistency:一致性
    一致性意味着,只有合法的数据可以被写入数据库,如果数据有任何违例(比如数据与字段类型不符),则事务应该将其回滚到最初状态。
  3. Isolation:隔离性
    事务允许多个用户对同一个数据的并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必修与其他并行事务的修改相互独立。
  4. Durability:持久性
    事务结束后,事务处理的结果必须能够得到固话(保存在可掉电的存储器上)。

事务隔离等级

在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。

JDBC与JTA的事务管理

分页

Hibernate提供了一个支持跨系统的分页机制,这样无论底层是什么样的数据库都能用统一的接口进行分页操作。比如下面的代码就是从第500条开始取出100条记录:

  1. Query q = session.createQuery("from FooBar as f");
  2. q.setFirstResult(500);
  3. q.setMaxResults(100);
  4. List l = q.list();

优化策略

见这里的总结

PS:一个SQL注入攻击的实例
例如,我们为了实现用户登录功能,编写了如下代码

  1. "from User user where user.name='"+username+"' and user.password='"+password+"'";

假设这里的username和password来自页面输入框中用户填写的数据。此时,如果我们在登录网页上输入用户名:
somebody' or 'x'='x
,密码随意,那么登录结果会很让人意外的成功。为什么呢,我们在看一下这个时候拼装得到的HQL:

  1. "from User user where user.name='somebody' or 'x'='x' and user.password='anyword';

显然,由于用户名中的
or 'x'='x'
被添加进了HQL作为一个子句执行,where逻辑必定为真(只要数据库中有用户名为somebody的记录存在),而密码是否正确无关紧要。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注