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



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

posted on 2014-08-10 21:00 france 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/france/p/4808666.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值