hibernate笔记

1.hibernate是一个持久层框架

框架模型

框架模型

2.什么是orm

  • Object relationship mapping
  • 编程语言:oop
  • 数据库:rdbms

3.第一个hibernate应用程序

  1. 新建立一个工程,并且加入hibernate的支持(4.1)
  2. 创建PO及配置文件(建议新建一个表)
  3. 使用API来操作PO对象
    • 获取session
    • 开启事务
    • 执行操作 session.save()
    • 提交事务
    • 关闭连接

4.核心配置文件

  • 一个数据源只需要一个核心配置文件。这个文件中包含三类内容:
    • 数据源配置
    • Hibernate的属性配置:例如show_sql,format_sql
    • 加载映射文件

5.映射文件的常用标记

  • 对类的配置:<class name=”类名” table=”表名”>
  • oid属性的映射:
      <id name=”属性名” type=”类型”>
        <column name=”列名”/>  
        <generator>  
      </id>
    
  • 普通属性的映射:<property></property>

6.mybatis和hibernate区别

  • Mybatis半自动,只需要写sql语句
  • hibernate全自动,只需要操作对象即可,sql语句它会替我们完成

7.如何创建Session

  • Configuration:配置文件
  • SessionFactory:session工厂
  • Session:核心接口
  • Code:
      Configuration config = new Configuration().configure();
      ServiceRegistry register = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
      SessionFactory factory = config.buildSessionFactory(register);
      Session session = factory.openSession();
      session.beginTransaction();
      ...
      session.getTransaction().commit();
      session.close();
      factory.close();
    

8.Session是什么?

  • Session是应用程序与hibernate之间的会话,它的作用是用来操作经过映射的实体对象
  • 同时,session也是个容器,它可临时保存着PO对象的引用
  • 也就是说session可以缓存数据库的数据

9.hibernate对对象修改

hibernate中如果对对象做了修改,若纳入到session的管理,不执行session的update语句也能将做出的修改写入数据库中

10.PO对象的三个状态(PO对象的生命周期)

  • 瞬时态:从没有持久化,也没有纳入到session的管理
  • 持久态:纳入session的管理
  • 游离态:曾经是持久化对象,当前不与session关联

    持久化对象的生命周期

11.常用的方法

  • flush:刷新
  • save:插入;忽略主键的设置
  • persist:插入,主键手动设置会报错
  • load:加载数据,如果数据库中没有相应的记录,则会抛出异常对象不找到(org.hibernate.ObjectNotFoundException)
  • get: 根据oid获得对应的PO对象,如果查询不到数据,返回 null
  • evict:从session中移除一个实体
  • clear:从session中移除所有的对象
  • close:关闭session,并从session中移除所有对象
  • update:修改游离态的对象(将游离态对象转成持久态对象)
  • delete:删除

12.get与load的区别

  • 作用:都是根据oid获取对应的实体
  • 区别:
    1. get会立即执行查询语句,得到的是真实对象,如果找不到,则返回null;
    2. load不会立即执行查询语句,返回一个代理对象,当需要访问这个实体时,才会发送sql语句,如果实体不存在,则抛出ObjectNotFoundException异常;
  • 相同点:
    • 查询时,先查询session缓存,如找到,无论找到的是真实对象还是代理对象,都不会再发sql语句;

13.主键的设计事项

  • 每个表都应该有主键,与之对应的实体也应该有个oid
  • 主键的设置应该是无意义的,最好是数字
  • hibernate的主键生成方式主要方式:
    1. increment:自增长(最大值+1),支持int,long,short
    2. indentity:mysql,db2,ms sqlserver支持,数据库自身的自增长
    3. sequence:序列
      • sql查询
        select hibernate_sequence.nextval from dual;
        select sq_表名.nextval from dual;
      • 配置文件
        <generator class="sequence">
             <param name="sequence">sq_表名</param>
         </generator>
        
    4. hilo:高低算法
    5. native:先identity,sequence,hilo
    6. assigned:手动分配,不建议使用
    7. uuid:生成128位的码,返回的是字符串,并发Insert要求较高的系统,推荐采用
    8. foreign:外键(一对一)
  • 一般而言,利用uuid.hex方式生成Hibernate主键将提供最好的性能和数据库平台适应性

14.PO生命周期

  • POJO+XML
  • POJO+annotation
  • mapped Entity

15.关系映射的学习方法

  • 表之间的关系
  • 类之间的关系
  • 映射文件的配置

16.PowerDesigner

  • 建模工具
    • 概念E-R图:不依赖与具体的数据库
    • 物理E-R图:可以直接生成sql语句
  • 步骤
    • 新建一个概念E-R图
    • 建立关系后,转成物理E-R图
    • 生成(oracle时,要转成大写)sql语句

17.一对多映射

  • 表关系:主外键
  • 类之间的系:Student,TClass;
  • 映射文件:
    • Student.hbm.xml
      • many-to-one
    • Tclass.hbm.xml
      • Set
        • key
        • one-to-many

18.注意事项

  • 动态sql:(class标记中的属性dynamic-insert,dynamic-update)
  • 集合排序:set标记中指定order-by="字段 asc|desc"

19.解决hibernate的懒加载

  • 将lazy改成false
  • 可以采用迫切左外连语句
  • 延迟session的关闭时间(jsp显示完毕后才关闭)
    • 通过OpenSessionInView的过滤器来实现,配置时,应该放在第一个Filter的位置上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值