Ejemplo n.º 1
0
 @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
 }
Ejemplo n.º 2
0
  @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);
  }
Ejemplo n.º 3
0
  @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);
  }
Ejemplo n.º 4
0
  @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异常

  }
Ejemplo n.º 5
0
  /** 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.
     */
  }
Ejemplo n.º 6
0
  @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,而会抛出异常 */
  }