• hibernate--session的CRUD方法, delete, load,get,update,saveorupdate, clear, flush


    • 删除方法:

    新建的对象立马被删除

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

     

    删除指定ID的对象:

    	@Test
    	public void testDelete2() {
    	
    		Teacher t = new Teacher();
    		t.setId(2);
    		
    		
    		Session session2 = sessionFactory.getCurrentSession();
    		session2.beginTransaction();
    		session2.delete(t);
    		session2.getTransaction().commit();
    	}
    

      

    • load, get区别:

    load返回的代理对象, 真正用到对象时才发出sql语句, 

    get直接从数据库加载,发出sql语句, 不会延迟.

    所以load必须在commit之前执行getName方法的操作.

    但是get放在commit之前之后都可以.

    @Test
    	public void testLoad() {
    	
    		Session session = sessionFactory.getCurrentSession();
    		session.beginTransaction();
    		Teacher t = (Teacher)session.load(Teacher.class, 1);  //此数字是ID
    		
    		System.out.println(t.getName());		
    		session.getTransaction().commit();
    		//System.out.println(t.getClass());
    	}
    	
    	@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());
    	}
    

    update:

    第一种情况: 用给的detached对象来更新persistent对象.

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

    第二种情况:更新transient对象会报错

    @Test
    	public void testUpdate2() {		
    		Teacher t = new Teacher();
    		t.setName("zhanglaoshi");  		
    		Session session2 = sessionFactory.getCurrentSession();
    		session2.beginTransaction();
    		session2.update(t);		
    		session2.getTransaction().commit();
    	}
    

    第三种情况, 手动设置ID后update, 数据库有对应记录

    @Test
    	public void testUpdate3() {		
    		Teacher t = new Teacher();
    		t.setId(3);
    		t.setName("zhanglaoshi");
    		
    		Session session2 = sessionFactory.getCurrentSession();
    		session2.beginTransaction();
    		session2.update(t);
    		
    		session2.getTransaction().commit();
    	}
    

      

    第四种情况: 我们在update的时候, 没有设置别的字段, 但是控制台把所有字段都输出了,效率低下.

    一个persistent状态的对象只要设定不同字段,  就会更新:

    @Test
      public void testUpdate4() {		
    	Session session = sessionFactory.getCurrentSession();
    	session.beginTransaction();
    	Teacher t = (Teacher)session.get(Teacher.class, 1);  //Persistent状态
    	t.setName("zhangsan2");  //缓存和数据库内容不一致, commit时统一
    	session.getTransaction().commit();
      }
    

      

    最后都没有得到我们想要的效果: 只更新想改变的字段, 有3种方法:

    1. xml和annotation设置

       annotation方法:Teacher.java里不想更新的字段的get方法前,加入@Column(updatable=false)

       xml方法:  <property name="title" update=false> </property>

    2. 使用xml的dynamic-update,     

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

    3. 推荐!!!  HQL (EJBQL)    

    注意: update后面的Student是对象, 不是表名

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

      

    saveorupdate:

    @Test
    	public void testSaveOrUpdate() {
    		
    		
    		Teacher t = new Teacher();
    		t.setName("t3");
    		t.setTitle("middle");
    		t.setBirthDate(new Date());
    		
    		Session session = sessionFactory.getCurrentSession();
    		session.beginTransaction();
    		session.saveOrUpdate(t);  //没有id所以执行的是save
    		
    		session.getTransaction().commit();
    		
    		t.setName("t7");
    		
    		Session session2 = sessionFactory.getCurrentSession();
    		session2.beginTransaction();
    		session2.saveOrUpdate(t);  //将上面插入的t3update成t7
    		session2.getTransaction().commit();
    		
    	}
    

    clear方法: 清除缓存, 不喝数据库打交道.  如果不用clear的话, getName就调用一次select语句, 因为缓存已经存在了

    不管get还是load都会先查一级缓存, 缓存没有才会去数据库查找, 所以clear就是清除session缓存

    @Test
    	public void testClear() {
    	
    		Session session = sessionFactory.getCurrentSession();
    		session.beginTransaction();
    		Teacher t = (Teacher)session.load(Teacher.class, 4);
    		System.out.println(t.getName());
    		
    		session.clear();
    		
    		Teacher t2 = (Teacher)session.load(Teacher.class, 4);
    		System.out.println(t2.getName());
    		session.getTransaction().commit();	
    		
    	}
    

      

    flush方法: 强制内存到数据库的同步

    	@Test
    	public void testFlush() {
    	
    		Session session = sessionFactory.getCurrentSession();
    		session.beginTransaction();
    		Teacher t = (Teacher)session.load(Teacher.class, 4);
    		t.setName("tt");		
    		
    		session.flush();		
    		t.setName("ttt");	
    		session.getTransaction().commit();		
    	}
    

      

      

     

     

  • 相关阅读:
    git爬坑不完全指北(二):failed to push some refs to ‘XXX’的解决方案
    javascript精雕细琢(三):作用域与作用域链
    javascript精雕细琢(二):++、--那点事
    git爬坑不完全指北(一):Permission to xxx.git denied to user的解决方案
    深入浅出CSS(三):隐藏BOSS大盘点之默认属性小总结
    读书笔记
    MPP5运维手册
    HTML自闭合(self-closing)标签
    Mysql JDBC的通信协议(报文的格式和基本类型)
    详解 & 0xff 的作用
  • 原文地址:https://www.cnblogs.com/wujixing/p/5416867.html
Copyright © 2020-2023  润新知