hibernate---CRUD

时间:2022-03-20 00:02:31

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

l  使用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);
}

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

相关文章