zoukankan      html  css  js  c++  java
  • hibernate第二天

    1.修改
    update()
    merge(): save() update() 有没有OID
    saveOrUpdate() 修改
    saveOrUpdate()和merge()区别
    解析:区别 1:saveOrUpdate() 会改变入参进来对象的状态 merge不会
    区别 2: saveOrUpdate() 没有返回值 merge返回一个对象
    2.OID
    OID 是持久化类(Student)与数据表主键对应属性, 用来唯一区分持久化对象。
    3.删除
    4.PO VO DTO POJO JavaBean
    JavaBean=POJO 和数据库无关的 PageUtil类,需要持久化不不需要
    PO=POJO+xml
    5.主键生成策略
    Increment :hibernate生成,弊端:多线程可能取到的是同一个id,但是导致其他线程保存失败
    identity: 数据库生成 ,mysql支持,oracle不支持
    sequence: 数据库生成,oracle支持
    native: 数据库决定:mysql使用identity,oralce使用序列
    uuid Hibernate生成 优点:不会重复,数据迁移比较好 要求:列的类型字符串
    assigned :程序员手动操作的。

    OID
    Hibernate中Java对象的三种状态
    get和load

    在 increment基础之上操作!
    hibernate中的三种状态
    瞬时状态:在数据库中没有关联的数据,没有加入Session中。
    持久状态:被session管理,拥有数据库标识。
    游离状态:脱离了与其关联的session的管理。

    01.瞬时状态 Student stu=new Student();
    新创建的对象,没有与session产生关联!
    02.持久状态 session.save(stu)
    被session管理,存在session缓存中!当commit的时候,会提交到数据库!
    03.游离状态 session.close(); stu
    曾经被session管理过,但是现在不存在session缓存中了!


    瞬时状态 和游离状态的区别在于:是否被session管理过! 对象是否拥有OID(对象标识符)!

    对象有主键值id,那么就有OID,在操作的时候会执行update语句!
    没有主键值id,那么就没有OID,在操作的时候会执行insert语句!

    对象只要是没有OID,在执行update()肯定报错!在执行saveOrupdate的时候会执行Save()方法!

    三种状态的转换:
    (1).瞬时状态转换为持久状态
    使用Session的Save( ),SaveOrUpdate( )等方法保存对象后,该对象的状态有瞬时 状态转为持久状态。
    使用Session的get( )或load( )方法获取对象,该对象的状态是持久状态
    (2).持久状态转为瞬时状态
    执行Session的delete( )方法后,对象由原来的持久状态变为瞬时状态,因此时对象没有与任何的数据库数据关联。
    (3).持久状态转为游离状态
    执行Session( )的evict( ),clear( )或close( )方法,对象由原来的持久状态转为游离状态。
    (4).游离状态转为持久转态
    执行Session的Update()或saveOrUpdate( )方法,对象由游离状态转为持久状态,该对象再次与当前Session相关联。
    (5).游离状态转为瞬时状态
    执行的Session的delete( )方法,对象由游离状态转为瞬时状态。

    6.核心API
    6.1 Configuration
    InputStream x = ConfigHelper.getResourceAsStream("/hibernate.properties");
    hibernate.hbm.xml配置文件
    6.2 SessionFactory:重量级的,一个程序中一份就可以了。线程安全的。
    Creates Sessions. Usually an application has a single SessionFactory.
    Threads servicing client requests obtain Sessions from the factory.
    创建会话。通常, 应用程序有一个单一的 SessionFactory。
    服务客户端请求的线程从工厂获取会话。
    SessionFactorys are immutable. The behaviour of a SessionFactory
    is controlled by properties supplied at configuration time.
    These properties are defined on Environment.
    SessionFactorys 是不可变的。SessionFactory 的行为由配置时提供的属性控制。
    这些属性是在环境中定义的。
    线程安全的::方法中来用一个对象,不用考虑线程安全问题
    成员变量,发现他是一个接口,接口中都是方法

    6.3 Session 他也是一个接口,实现类是SessionImpl ,当中也是方法,但是他是线程非安全的。
    Session构建两种方式
    方式一:factory.openSession(); 随机从连接池中获取到一个连接。每次取得的session一定是新的。
    factory.getCurrentSession(); 一定获取的是和当前线程绑定的session.调度多次,内存地址一样,同一个对象

    6.4 事务

    7.刷新缓存(某一时刻点触发的动作)
    tx.commit() ;刷新缓存 刷新缓存做什么 (做脏检查)
    快照(Snapshot)是某个数据集在某一特定时刻的镜像,也称为即时拷贝,它是这个数据集的一个完整可用的副本


    Configuration cfg;
    Session session;
    Transaction tx;
    SessionFactory factory;
    @Before
    public void myBefore(){
    //创建配置对象
    cfg=new Configuration().configure();
    // 2.根据配置对象创建SessionFactory
    factory=cfg.buildSessionFactory();
    //3.根据SessionFactory去创建Session
    session= factory.openSession();

    //3.5在Session创建后开启事务 xxx0001 xxxxx003
    tx= session.beginTransaction();
    }
    @Test
    public void loadTest(){
    Dog dog = session.get(Dog.class, 6);
    System.out.println(dog.getDogname());
    }
    @Test
    //01.修改
    public void testUpdate(){
    //修改一个编号为2的狗狗信息
    Transaction tx = session.beginTransaction();
    Dog dog=new Dog();//瞬时态
    dog.setDogname("嘿嘿");
    dog.setDogage(12);
    session.merge(dog);//持久态
    /* Dog dog=session.load(Dog.class,2);
    dog.setDogname("大黄3");
    dog.setDogage(33);
    session.update(dog);*/
    tx.commit();
    System.out.println("update ok!");
    }
    //02.删除
    @Test
    public void testDelete(){
    //修改一个编号为2的狗狗信息
    Transaction tx = session.beginTransaction();
    Dog dog=new Dog();//瞬时态
    System.out.println(session+"===========================");
    /* session.delete(dog);
    tx.commit();*/
    System.out.println("del ok!");
    }
    @Test
    public void testCahce(){
    Dog dog2 = session.get(Dog.class, 6);
    System.out.println(dog2.getDogname());

    Dog dd=new Dog();
    dd.setDogage(11);
    dd.setDogname("小花是狗");
    dd.setDogid(11);
    session.update(dd);
    tx.commit();
    Dog dog = session.get(Dog.class, 6);
    System.out.println(dog.getDogname());
    System.out.println(dd.getDogname());
    //
    }

  • 相关阅读:
    朴素贝叶斯分类算法原理
    DevExpress控件学习总结
    Nginx + Tomcat 配置负载均衡集群
    DotNet Core全新认识
    为何梯度反方向是函数值下降最快的方向
    理解矩阵
    C#版-Redis缓存服务器在Windows下的使用
    文本情感分类:分词 OR 不分词(3)
    文本情感分类:深度学习模型(2)
    文本情感分类:传统模型(1)
  • 原文地址:https://www.cnblogs.com/wangbenqing/p/7583286.html
Copyright © 2011-2022 走看看