Hibernate框架笔记整理--二

来源:互联网 发布:perl from json 编辑:程序博客网 时间:2024/05/18 01:39


Hibernate框架

  1. 持久化类的编写规范

持久化类:与配置文件做映射的实体类,包括javaBean、配置文件。

编写规范:

  1. 提供无参的构造方法(hibernate通过无参构造实例化对象)

  2. 所有属性私有化

  3. 提供getset方法

  4. 基本类型与包装类型,建议全部用包装类型(防止有歧义)

  5. 持久化类不能被final修饰,hibernate的优化手段会失效

    如:延迟加载会变成立即加载,因为load查询返回的是代理对象,而此代理对象是由实体类的子类生成的。

  6. 持久化类必须由标识属性(OID属性)

    表示属性(OID属性)就是与表主键建立映射关系的属性

Ps:标识属性的作用

      OIDObject Identifie的简称),hibernate用它来区分多个对象是否为同一个。

      Jvm中用内存中的地址区分对象,

      数据库中用主键区分对象,

      Hibernate中用OID区分对象

 

使用Hibernate中提供的“主键生成策略”来保证OID的唯一性。

  1. 主键生成策略

    针对数值类型:native

    针对字符创类型:uuid

    Ps主键也可以不用hibernate维护,自己动手在程序中设定唯一非空(assigneduuid

  2. 持久化类的三种状态,及互相装换

    瞬时态:当前持久化类 没有oid属性 没被session操作管理

    持久态:当前持久化类 有oid属性 有被session操作管理

    托管态(离线态):当前持久化类 有oid属性 没被session操作管理

    Ps:持久态特点  

           只要涉及到查询返回的就都是持久化类的持久态对象

           只要持久态对象修改完属性,不需执行更新操作,会自动更新数据库

    (因为有一级缓存的存在)

  3. 一级缓存的原理

    session.get(Customer.class,"abcdefg");  // 去数据库查询,查完了之后放在一级缓存中

                                                    一级缓存

                                                           存储区

                                                                  放一份

                                                           快照区

                                                                  备份一份

     

 

 

 

 

ct.setCust_name("rose1234");  // 去一级缓存中的存储区修改了内容,但是快照区不修改

                                                一级缓存

                                                       存储区

                                                              修改了

                                                       快照区

                                                              以前的

 

 

tx.commit();     // 去一级缓存中,将存储区和快照区的数据都拿出来对比

                           一致: 什么都不做

                                  不一致: 自动发送update语句做数据的数据更新

 

关闭缓存的办法:session.close();  //session关闭,缓存也销毁

                           session.clear();   //clear可以清空一级缓存的所有数据

                           session.evict();   //可清空一级缓存某一个对象的数据

 

  1. 针对单表批量查询的方式:QueryHQL查询

Configuration configuration = new Configuration();

//自动去src下加载名字叫hibernate.cfg.xml的配置文件

             configuration.configure();

             SessionFactory sessionFactory =configuration.buildSessionFactory();

             Session session =sessionFactory.openSession();

             Transaction tx = session.beginTransaction();

             // Query方式的HQL查询

             Queryqr = session.createQuery("from Customer");

             List<Customer> list =qr.list();

             for (Customer customer : list) {

                    System.out.println(customer);

             }

 

             //提交事务,关闭连接

             tx.commit();

             session.close();     

      }

  1. 针对单表批量查询的方式:CriteriaQBC查询(完全面向对象)

Configuration configuration = new Configuration();

//自动去src下加载名字叫hibernate.cfg.xml的配置文件

                    configuration.configure();

                    SessionFactorysessionFactory = configuration.buildSessionFactory();

                    Sessionsession = sessionFactory.openSession();

                    Transactiontx = session.beginTransaction();

                    

             // Criteria方式的QBC查询

             

             Criteria iter =session.createCriteria(Customer.class);

             //条件查

             Iter.add(Restrictions.like(“cust_name”, “b%”));

             //分页查

             Iter.setFirstResult(1);

             Iter.setMaxResult(3);

             //排序查

             Iter.addOrder(Order.desc(“cust_id”));

             //聚合查

             Iter.setProjection(Projection.rowCount());

             Object obj = iter.uniqueResult();