zoukankan      html  css  js  c++  java
  • Hibernate 再接触 核心开发接口

    1.可以重载方法进行配置文件的指定

    sessionFactory = new AnnotationConfiguration().configure("hibernate.xml").buildSessionFactory();

    这样读取到的就是hibernate.xml 但一般不建议修改

    getcurrentsession 指的是上下文如果没有提交 就不会创建新的session

    opensession 永远打开新的session 用于鉴定事务边界 比如加入日志操作等

     事务:要么同时完成,要么就回滚

        <property name="current_session_context_class">thread</property>

    从当前线程里找 

    还有其他几个参数:

    例如 jta ,managed,custorm.class等

    thread使用数据库链接作为事务管理

    但是管理不了分布式事务

    jta(java trasaction api) 往往用在分布式上

    需要一个manager管理对部署在两个数据库的操作

    如果不设上下文他就无法找到

    opensession尽量不要跟getcurrentsession同用 不是同一个session

    缓存就是内存中的一块区域 放着我们想要提高读取效率的对象

     对象的三种状态

    Transient persistent detached

    Transient 内存有一个对象 但是没有id 缓存中也没有  数据库也没有

    persistent 内存有 缓存中有 数据库有 也有id   session里有key和value

    detached 内存有 缓存没有 数据库有

    三种状态区分在于:

    有没有id

    id在数据库中有没有

    在内存中没有(session缓存)

    session 管理一个数据库的任务单元  管理增删改查的操作

    save 略

    delete 

    只要有id 包括detach态 就可以delete

    例如:

    @Test
        public void testDelete() {
        
            Teacher t = new Teacher();
            t.setName("t1");
            t.setTitle("middle");
            t.setBirthDate(new Date());
            
            Session session = sessionFactory.getCurrentSession();
            session.beginTransaction();
            session.save(t);
            System.out.println(t.getId());
            session.getTransaction().commit();
            
            Session session2 = sessionFactory.getCurrentSession();
            session2.beginTransaction();
            session2.delete(t);
            session2.getTransaction().commit();
        }
        
        @Test
        public void testDelete2() {
        
            Teacher t = new Teacher();
            t.setId(2);
            
            
            Session session2 = sessionFactory.getCurrentSession();
            session2.beginTransaction();
            session2.delete(t);
            session2.getTransaction().commit();
        }
        

    Load 读

    @Test
        public void testLoad() {
        
            Session session = sessionFactory.getCurrentSession();
            session.beginTransaction();
            Teacher t = (Teacher)session.load(Teacher.class, 1);
            
            session.getTransaction().commit();
            System.out.println(t.getClass());
            //System.out.println(t.getName());
        }
        

    1 是可以自动打包

    get也可以拿数据

        @Test
        public void testGet() {
        
            Session session = sessionFactory.getCurrentSession();
            session.beginTransaction();
            Teacher t = (Teacher)session.get(Teacher.class, 1);
            
            session.getTransaction().commit();
            System.out.println(t.getClass());
            //System.out.println(t.getName());
        }

    两者区别:

    需要注意的是 get 和load方法有重要区别 load种 是生成一个代理 当真正想使用对象的属性的时候才会发出sql语句 而get是马上就发

    update

    更新detach的一个对象

        @Test
        public void testUpdate1() {
        
            Session session = sessionFactory.getCurrentSession();
            session.beginTransaction();
            Teacher t = (Teacher)session.get(Teacher.class, 1);
            
            session.getTransaction().commit();
            
            t.setName("zhanglaoshi");
            
            Session session2 = sessionFactory.getCurrentSession();
            session2.beginTransaction();
            session2.update(t);
            
            session2.getTransaction().commit();
        }

    更新transient 会报错 但是更新有id的transient不会报错 (数据库有对应记录)

        @Test
        public void testUpdate4() {
            
            
            Session session = sessionFactory.getCurrentSession();
            session.beginTransaction();
            Teacher t = (Teacher)session.get(Teacher.class, 1);
            t.setName("zhangsan2");
            session.getTransaction().commit();
        }

    以上的更新会更新所有字段 为提高效率 所以摸索

    如何只改想要的字段

    如果是p对象 只要设置字段 就会发生更新

    @Test
        public void testUpdate5() {
            
            
            Session session = sessionFactory.getCurrentSession();
            session.beginTransaction();
            Student s = (Student)session.get(Student.class, 1);
            s.setName("zhangsan5");
            session.getTransaction().commit();  //发现对象与数据库中不同 自动update
            
            s.setName("z4");
            
            Session session2 = sessionFactory.getCurrentSession();
            session2.beginTransaction();
            session2.update(s);
            session2.getTransaction().commit();
        }

    但是这种更新还是全部的

    要想实现只更新想要更新的字段

    有三种方法:

    1.加上column = false属性

    或者xml加入column = false属性

    2.在xml中加入

        <class name="com.bjsxt.hibernate.Student" dynamic-update="true">

    这样在数据库提交的时候就会只更新自己想改的字段 

    但是要注意 这个对象一旦在处瑜detach状态 再提交commit的时候无法作比较 所以就无法更新 所以更新的还是全部字段

        @Test
        public void testUpdate6() {
            
            
            Session session = sessionFactory.getCurrentSession();
            session.beginTransaction();
            Student s = (Student)session.get(Student.class, 1);
            s.setName("zhangsan6");
            session.getTransaction().commit();
            
            s.setName("z4");
            
            Session session2 = sessionFactory.getCurrentSession();
            session2.beginTransaction();
            session2.merge(s);//merge可以合并对象 这样也不用发多余的其他字段的修改
            session2.getTransaction().commit();
        }

    第三种 是hql语句 后面也还会详细讲

    @Test
        public void testUpdate7() {
            
            
            Session session = sessionFactory.getCurrentSession();
            session.beginTransaction();
            Query q = session.createQuery("update Student s set s.name='z5' where s.id = 1");
            q.executeUpdate();
            session.getTransaction().commit();
            
        }

    save orupdate

    @Test
        public void testSaveOrUpdate() {
            
            
            Teacher t = new Teacher();
            t.setName("t1");
            t.setTitle("middle");
            t.setBirthDate(new Date());
            
            Session session = sessionFactory.getCurrentSession();
            session.beginTransaction();
            session.saveOrUpdate(t);
            
            session.getTransaction().commit();
            
            t.setName("t2");
            
            Session session2 = sessionFactory.getCurrentSession();
            session2.beginTransaction();
            session2.saveOrUpdate(t);
            session2.getTransaction().commit();
            
        }

    没有的话就save 有的话就update

    clear

    无论是load还是get 都会首先查找缓存(一级缓存),如果没有 ,才会去数据库查找,调用clear方法可以强制清除session缓存

    @Test
        public void testClear() {
        
            Session session = sessionFactory.getCurrentSession();
            session.beginTransaction();
            Teacher t = (Teacher)session.load(Teacher.class, 1);
            System.out.println(t.getName());
            
            session.clear();//如果不加这句话 将只发出一条select sql语句 ,加了之后清除session缓存下面就需要重新发了
            
            Teacher t2 = (Teacher)session.load(Teacher.class, 1);
            System.out.println(t2.getName());
            session.getTransaction().commit();
            
            
        }

    flush方法

    强制让缓存内容与数据库内容同步

    具体在什么时间flush 是由flushmode设置

        @Test
        public void testFlush() {
        
            Session session = sessionFactory.getCurrentSession();
            session.beginTransaction();
            Teacher t = (Teacher)session.load(Teacher.class, 1);
            t.setName("tttt");
            
            
            session.flush();      //强制与数据库同步,发出update
            
            t.setName("ttttt");
            
        
            session.getTransaction().commit();  //发现不一致 再发出update
            
            
        }

    testschemaexport 

    可以在配置文件中不让他自动建表

    然后自己写一个类建表

    第一个参数这是指是否显示ddl语句 第二个参数是指是否执行ddl语句

    @Test
        public void testSchemaExport() {
            new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
        }
  • 相关阅读:
    The connection to adb is down, and a severe error has occured.问题解决
    JavaScript的实现
    Dreamer2.1 发布 新增将Bean解析成xml和json
    由某公司的面试小题目说起,对责任链模式的总结
    TCP协议中的SO_LINGER选项
    杭电2602(01背包问题)——第一次做背包问题的理解
    [置顶] 浏览器模式和标准对于javascript的影响
    李克强总理坚决不“救市”底气何来?
    lua序列化table表到文件中
    获取java byte的无符号数值
  • 原文地址:https://www.cnblogs.com/frankzone/p/9592659.html
Copyright © 2011-2022 走看看