Hibernate----学习(5)----session的核心方法

1.save()方法

/*
	 * save()
	 * 1.使一个临时对象变成一个持久化对象。
	 * 2.为对象分配id
	 * 3.在flush缓存时会发送一条insert语句
	 * 4.在save方法是之前设置id时无效的
	 * 5.持久化对象的id是无法改变的
	 */
	@Test
	public void testSave(){
		News news = new News();
		news.setId(100);  //在save方法是之前设置id时无效的
		news.setName("aa");
		news.setGender("ss");
		news.setDateTime(new Date());
		System.out.println(news);
		session.save(news);
		news.setId(101);   //持久化对象的id是无法改变的
		System.out.println(news);

	}

2.persist()方法

/*
 * persist()方法也会执行insert操作
 * 
 * persist()  VS save();
 *     在调用persist方法之前如果已经有id了,则不会执行inset操作,会抛出异常。 
 */
	@Test
	public void testPersist(){
		News news = new News();
		news.setId(100);
		news.setName("ee");
		news.setGender("ee");
		news.setDateTime(new Date());
		session.persist(news);
	}

3. get()方法    VS    load()方法

/*
	 * get()  VS load()
	 * 1.执行get方法:会立即加载对象
	 *   执行load方法:若不使用该对象,则不会立即执行查询操作,而是返回一个代理对象
	 *
	 *   get时立即检索  load是延迟检索
	 *
	 * 2.若数据库中没有对应的记录,session没有被关闭:
	 *    get返回null
	 *    load   不使用该对象的属性的话没问题;若使用对象的属性,会抛出异常
	 *
	 * 3.load方法可能会抛出LazyInitializationException 异常:
	 *     代理对象需要初始化时之前已经关闭了session
	 *   
	 */

	@Test
	public void testGet(){

		News news = (News) session.get(News.class,15);
		System.out.println(news);
	}

	@Test
	public void testLoad(){
		News news = (News) session.load(News.class,15);
		System.out.println(news.getClass().getName());
	}

4.update()方法

/*
	 * update():
	 * 1.若要更新一个持久化对象,不需要显示的调用update()方法。因为
	 *  Transaction在commit()之前,会调用session的flush方法。
	 *
	 * 2.若要更新一个游离对象,需要显示的调用session的update方法。
	 *    可以把一个游离对象转化为一个持久化对象。
	 *
	 * 注意:1.无论更新的游离对象是否和数据库的对象一致,都会发送update语句
	 *         原因:游离对象并不是在同一个session里,则无法保证是该游离对象是否
	 *               一致,所以需要发送update语句
	 *
	 *        (在更新持久化对象的时候,如果和数据库的对象一致,则不会发送update语句
	 *         原因:在事务最终commit之前,会调用session的flush方法,去检查是否与数据库对象
	 *               一致。只有在不一致的情况下,才会发送update语句
	 *        )
	 *
	 *        2.若查询数据库不存在的游离对象,则会抛出异常。
	 *
	 *        3.当 update() 方法关联一个游离对象时,
	 *          如果在 Session 的缓存中已经存在相同 OID 的持久化对象,
	 *          会抛出异常。因为session缓存中,不能同时拥有两个OID一样的持久化
	 *          对象。
                 News news = (News) session.get(News.class,5);
                 transaction.commit();
		         session.close();

		         session =sessionFactory.openSession();
		         transaction = session.beginTransaction();
		         News news2 = (News) session.get(News.class,5);
	 *           session.update(news);
	 */
	@Test
	public void testUpdate(){

		News news = (News) session.get(News.class,5);
		transaction.commit();
		session.close();


		session =sessionFactory.openSession();
		transaction = session.beginTransaction();
		//news.setName("rr");
		session.update(news);

	}

5.delete()方法:

  /*
      * delete:
      *  1.执行删除操作,只要OID和数据表中的一条记录对应,就会准备执行delete操作。
      *  2.若OID在数据表中没有对应的记录,则会抛出异常。
      *  
      *
      */
	@Test
	public void testDelete() {
		News news = (News) session.get(News.class,5);
		session.delete(news);
	}

6.evict()方法:

  /*
     *evict():从session中把指定的持久化对象移除。
     */
    @Test
    public void testEvict() {
        News news = (News) session.get(News.class,7);
        News news1 = (News) session.get(News.class,6);
        news.setName("qq");
        news1.setName("qq");
        session.evict(news1);

    }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值