zoukankan      html  css  js  c++  java
  • 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();		
    	}
    

      

      

     

     

  • 相关阅读:
    R语言:提取路径中的文件名字符串(basename函数)
    课程一(Neural Networks and Deep Learning),第三周(Shallow neural networks)—— 0、学习目标
    numpy.squeeze()的用法
    课程一(Neural Networks and Deep Learning),第二周(Basics of Neural Network programming)—— 4、Logistic Regression with a Neural Network mindset
    Python numpy 中 keepdims 的含义
    课程一(Neural Networks and Deep Learning),第二周(Basics of Neural Network programming)—— 3、Python Basics with numpy (optional)
    课程一(Neural Networks and Deep Learning),第二周(Basics of Neural Network programming)—— 2、编程作业常见问题与答案(Programming Assignment FAQ)
    课程一(Neural Networks and Deep Learning),第二周(Basics of Neural Network programming)—— 0、学习目标
    课程一(Neural Networks and Deep Learning),第一周(Introduction to Deep Learning)—— 0、学习目标
    windows系统numpy的下载与安装教程
  • 原文地址:https://www.cnblogs.com/wujixing/p/5416867.html
Copyright © 2011-2022 走看看