@Test public void get() { // get()方法加载一个对象到内存 News news = (News) session.get(News.class, 10905); System.out.println(news); // 调用get()方法会马上发送一条sql语句查询对象 System.out.println(news.getClass().getName()); // 若该对象不存在的话,返回一个null }
@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); }
@Test public void load() { // get()方法加载一个对象到内存 News news = (News) session.load(News.class, 10095); // System.out.println(news.getAuthor()); // 调用该方法并没有马上查询,而是返回一个代理对象 System.out.println(news.getClass().getName()); // 面试题: /** * 1.执行get()方法会立即加载对象 2.而执行load()方法若若不使用该对象,则不会执行查询操作,而返回一个代理对象 3.load()方法使用延迟加载,使用时在加载 * get是立即检索,load是延迟检索 4.在需要初始化队里对象之前关闭了Session,会抛出懒加载异常 5.若不使用该对象的任何属性没问题,不会抛出异常 * 6.当update()方法关联一个游离对象时,如果在session中的缓存中 以及存在的了相同的OID的持久化对象,则会抛出异常,因为在session缓存中不能有两个OID相同的对象 */ // 若该方法不存在是,抛出一个ObjectNotFoundException异常 }
/** 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,而会抛出异常 */ }