@Test public void evict() { // 从session缓存中把指定的持久化对象移除 News news1 = (News) session.get(News.class, 1004); News news2 = (News) session.get(News.class, 1004); news1.setAuthor("aa"); news2.setAuthor("bb"); session.evict(news1); }
@Test public void testFlush() { News news = (News) session.get(News.class, 1001); System.out.println(news); // 是在session的生命周期中,开了一个事务,Session可以感知到 news.setAuthor("hecheng"); session.flush(); /** * flush使数据表中的记录和session缓存中的对象的状态保存一致 为了保持一致则可能会发送对应的sql语句 1.调用Transaction的commit()方法中: * 在该方法中先进行flush()方法,然后在提交事务 2.flush()方法方法可能会发送sql语句,但不会提交事务 3.显示flush()方法 */ // session.get(News.class, 1001); News news1 = (News) session.createCriteria(News.class).uniqueResult(); System.out.println(news1); }
/** 1.若更新一个持久化对象,不需要显示调用update()方法,因为在 调用Transaction的commit()方法时,会先执行session的flush方法 */ @Test public void testUpdate() { News news = (News) session.get(News.class, 1005); // transaction.commit(); // session.close(); // session=sessionFactory.openSession(); // transaction=session.beginTransaction(); // // 可以把一个游离对象变为持久化对象 news.setAuthor("zhangsan"); // session.update(news); /** * 1.即使该对象没有变化,调用该方法都会发送update()语句 2.和触发器协同工作时可能会发生问题 3.解决方案? * 如何能让update()方法不再盲目触发update()语句,得在更新之前 查询数据库 在hbm.xml文件中设置select-before-update="true"即可 * 只有在跟触发器协工作时才设置该属性 4.如果对一个数据表不存的对象,调用update()方法会抛出异常 5. */ }
@Test public void testSave() { // save()方法,把一个临时对象变为持久化对象,同时保存在数据库中 News news = new News(); news.setAuthor("sic"); news.setDate(new java.sql.Date(new java.util.Date().getTime())); news.setTitle("Oracle11"); System.out.println(news); // news.setId(1000); // session.save(news); news.setId(10000); session.persist(news); System.out.println(news); /** * 1.save:执行save()方法后为对象分配ID 2.在flush缓存时会计划执行一条insert语句 3.ID:在save()方法之前的ID是无效的 * 4.在save()方法之后持久化对象的ID是不能被修改的 */ /** persist()方法之前,若对应已经有了id了,则不会执行insert,而会抛出异常 */ }