• hibernate---CRUD


    delete

    @Test
    	public void testDelete() {
    	
    		Teacher t = new Teacher();
    		t.setName("t1");
    		t.setTitle("middle");
    		t.setBrithday(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返回的是代理对象,get直接加载

    	@Test         //从数据库拿一条记录
    	public void testLoad() {
    	
    		Session session = sessionFactory.getCurrentSession();
    		session.beginTransaction();
    		//得到主键为1记录 然后变成一个对象
    		Teacher t = (Teacher)session.load(Teacher.class, 1);
    		//得到的是一个代理,并没有发出sql语句  需要的时候才发出
    		//比如说Teacher t = (Teacher)session.load(Teacher.class, 55);55不存在也不报错
    		session.getTransaction().commit();
    		System.out.println(t.getClass());<span style="font-family: Arial, Helvetica, sans-serif;"> //测是不是代理对象返回com.zjx.hibernate.Teacher_$$_javassist_1 (父类是teacher) 这个是代理对象</span>
    
    		//System.out.println(t.getName()); 这句放这会报错,
    	}
    	
    	@Test
    	public void testGet() {
    	
    		Session session = sessionFactory.getCurrentSession();
    		session.beginTransaction();
    		Teacher t = (Teacher)session.get(Teacher.class, 1);
    		//当用get方法的时候是马上拿的,直接从数据库加载不产生延迟
    		//比如说Teacher t = (Teacher)session.load(Teacher.class, 55);55不存在会报错!!
    		session.getTransaction().commit();
    		System.out.println(t.getClass()); //测是不是代理对象 返回 com.zjx.hibernate.teacher 所以不是代理对象
    		//System.out.println(t.getName());
    	}


    Update()方法

    1 用来更新detached对象,更新完成之后成为persistent.

    2 更新transient对象会报错. 更新自己设定id(前提是id在数据库中存在)的transient对象可以.

    3 持久化的对象只要设定不同字段就会发生更新

    4 更新部分更改的字段(三种方法)

    l  XML设定property标签的update=true|false属性,

    annotation设定@Column(updatable=false)属性,这种方式少用,不灵活.

    l  XML设定class标签的dynamic-update=”true”属性,

    同一个session中可以,跨session不行.跨session时的实现方法不过可以用session的merge().merge方法会先从数据库load,将得到的和数据库中的进行对比,再update更改过的字段.

    JPA1.0 Annotation没有对应的属性,Hibernate

    使用HQL(EJBQL)(建议使用)

    public void testUpdate7() {
    		
    		//常用的方法
    		Session session = sessionFactory.getCurrentSession();
    		session.beginTransaction();
    		//里面放的是 select or update 语句                                      类名          对象
    		Query q = session.createQuery("update Student s set s.name='z5' where s.id = 1");
    		q.executeUpdate();
    		session.getTransaction().commit();
    		
    	}

    	@Test
    	public void testSaveOrUpdate() {
    		
    		
    		Teacher t = new Teacher();
    		t.setName("t1");
    		t.setTitle("middle");
    		t.setBrithday(new Date());
    		
    		Session session = sessionFactory.getCurrentSession();
    		session.beginTransaction();
    		session.saveOrUpdate(t);  //save
    		
    		session.getTransaction().commit();
    		//t变成托管对象
    		t.setName("t2"); 
    		
    		Session session2 = sessionFactory.getCurrentSession();
    		session2.beginTransaction();
    		session2.saveOrUpdate(t);   //update
    		session2.getTransaction().commit();
    		
    	}
    	
    	@Test
    	public void testClear() {
    	
    		Session session = sessionFactory.getCurrentSession();
    		session.beginTransaction();
    		Teacher t = (Teacher)session.load(Teacher.class, 1);
    		System.out.println(t.getName());//输出select语句
    		
    		session.clear();//未加这条只有一个select语句
    		
    		Teacher t2 = (Teacher)session.load(Teacher.class, 1);
    		System.out.println(t2.getName());
    		session.getTransaction().commit();
    		
    		
    	}
    	
    	@Test
    	public void testFlush() {
    	
    		Session session = sessionFactory.getCurrentSession();
    		session.beginTransaction();
    		Teacher t = (Teacher)session.load(Teacher.class, 1);
    		t.setName("tttt");
    		
    		
    		session.flush();//未加这条只有一句set语句 强制让缓存和 数据库数据做同步 
    		//和clear的区别就是 clear不进行下面这句
    		
    		t.setName("ttttt");
    		
    	
    		session.getTransaction().commit();
    		
    		
    	}
    	
    	@Test
    	public void testSchemaExport() { //自动建表
    		new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
    	}



    版权声明:本文为博主原创文章,未经博主允许不得转载。

    today lazy . tomorrow die .
  • 相关阅读:
    定时任务的分布式调度
    springmvc 静态资源 配置
    activemq 持久化
    函数式编程与面向对象编程的比较
    LeetCode 108——将有序数组转化为二叉搜索树
    LeetCode 104——二叉树中的最大深度
    LeetCode 700——二叉搜索树中的搜索
    线性代数之——四个基本子空间
    线性代数之——线性相关性、基和维数
    线性代数之——秩和解的结构
  • 原文地址:https://www.cnblogs.com/france/p/4808666.html
Copyright © 2020-2023  润新知