• hibernate框架(三)持久化类&主键生成策略


    一 持久化类的一个编写规则

    持久化:将内存中的一个对象持久化到数据库中的过程
    持久化类:一个Java对象与数据库的表建立了映射关系,那么这个类在hibernate中称为持久化类
    可以这么理解:持久化类=Java类+映射文件

    持久化类的编写规则
    1 对持久化类提供一个无参的构造方法
    2 属性需要私有,对私有属性提供get和set方法
    3 对持久化类提供一个唯一标识Oid与数据库中主键对应
    4 持久化类中属性尽量使用包装类类型
    5 持久化类不要使用final进行修饰


    二 主键生成策略

    先介绍一下主键的分类:自然主键和代理主键
    自然主键:主键的本身就是表中的一个字段(试题中的一个具体的属性 身份证号)
    代理主键:主键的本身不是表中必须的一个字段(不是实体中某个具体的属性)
    在实际开发中,尽量使用代理主键
    为什么不推荐使用自然主键,因为一旦自然主键参与到业务逻辑中,后期可能修改源代码
    好的程序设计满足OCP原则:对程序的扩展是open的。对修改源代码是close的


    主键生成策略(记住):
    increment hibernate中提供的自动增长机制,单线程可以使用,多线程不可以
    identity 使用的是数据库底层的自动增长机制(适用于MySQL SQL server,但是Oracle不适合)
    sequence 采用的是序列的方式(适用于Oracle,MySQL就不适用)】
    uuid 适用于字符串类型的主键
    native 本地策略 ,可以在identity和sequence之间进行自动转换
    assigned hibernate放弃外键的管理

    结合不同的情况去使用
    编程中遇到的问题
    没有写自动生成语句的配置 ,导致hibernate不能为你创建表

    <property name="hibernate.hbm2ddl.auto">update</property>

    三 持久化类的三种状态

    hibernate是持久层框架,通过持久化类完成ORM操作。Hibernate为了更好的管理持久化类
    将其分为三种:瞬时态、持久态、托管态
    瞬时态:这种对象没有唯一的标识OID,没有被session管理
    持久态:这种对象有唯一标识OID,被session管理
    托管态:这种对象有唯一标识OID,没有被session管理
    下面代码演示:这段程序包含了持久化的三种状态

    public class TestDemo2 {
        @Test
        public void demo1(){
            Session session = HibernateUtils.openSession();
            Transaction beginTransaction = session.beginTransaction();
            
            Customer customer=new Customer();    
            customer.setCust_name("王六");//瞬时态对象。没有唯一标识的OID,没有session管理        
            
            Serializable id = session.save(customer);//持久态对象。有了唯一标识的OID,调用了session
            
            beginTransaction.commit();
            session.close();
            System.out.println(customer.getCust_name());//托管态对象。有唯一标识的OID,session被销毁了
        }
    }


    我们重点研究的是持久态对象,
    持久化类的持久态对象,可以自动更新数据库。

    @Test
        //持久态对象自动更新数据库
        public void demo2(){
            Session session = HibernateUtils.openSession();
            Transaction beginTransaction = session.beginTransaction();
            //获得持久态对象
            Customer customer = session.get(Customer.class, 1l);
            customer.setCust_name("小红");
            
            beginTransaction.commit();
            session.close();
        }

    我们可以看出并手动调用update方法,Hibernate就可以自动更新数据库了,持久态之所以有这样的功能主要依赖于他的一级缓存

    四、Hibernate的一级缓存

    什么是缓存:是一种优化的方式,将数据存放到内存中,使用的时候直接从缓存中去取
    优化手段:缓存、抓取策略
    一级缓存称为是session级别的缓存,生命周期和session一致。

    五、Hibernate的事务控制


    事务:指的是逻辑上的一组操作,组成这组操作的逻辑单元要么全部成功,要么全部失败
    事务的四个特性:原子性、一致性、隔离性、持久性

    • Read Uncommitted(1级)
    • Read committed(2级)
    • Repeatable read(4级)
    • Serializable 序列化(8级)

    实际开发中,不会选择最高或者最低隔离级别,选择Read committed(oracle默认),Repeatable read(mysql默认)。


    Hibernate解决service的事务管理

    1.在工具类中更改getCurrentSession方法

    public static Session getCurrentSession(){
            return sessionFactory.getCurrentSession();
        }

    2.在核心配置文件中进行如下配置

      <!-- 配置session绑定当前线程 -->
       <property name="hibernate.current_session_context_class">thread</property>

    六、Hibernate中其他的API

    1.Query

         //条件查询
            String hql="from Customer where cust_name like ?";
            Query createQuery = session.createQuery(hql);
            createQuery.setParameter(0, "王%");
         //分页查询
            String hql="from Customer";
            Query createQuery = session.createQuery(hql);
            createQuery.setFirstResult(0);
            createQuery.setMaxResults(2);

    2.Criteria

             //分页查询
            Criteria criteria = session.createCriteria(Customer.class);
            criteria.setFirstResult(3);
            criteria.setMaxResults(2);    

    Criteria更加的面向对象。

  • 相关阅读:
    ios修改了coredata数据结构后,更新安装会闪退
    iOS开发系列--UITableView全面解析
    iOS七种手势
    iOS 手势操作:拖动、捏合、旋转、点按、长按、轻扫、自定义
    iOS学习必须了解的七大手势
    iOS中respondsToSelector与conformsToProtocol的相关理解和使用
    iOS-MBProgressHUD使用
    ios学习--第三方框架-MBProgressHUD以及扩展
    Problem 2169 shadow
    測试加入多级文件夹篇
  • 原文地址:https://www.cnblogs.com/bao6/p/10340122.html
Copyright © 2020-2023  润新知