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); }
版权声明:本文为博主原创文章,未经博主允许不得转载。