Hibernate基础2

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中的三种状态   
  *
  *  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()方法!
  *
  */

    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();  随机从连接池中获取到一个连接。

             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());
//
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值