hibernate的对象状态

在hibernate中将对象大致分为四类:

1、临时状态:它指的是对象已经创建了,但是没有引用,在数据库中没有对应的对象。例子如下:在下面的例子是打印不出sql语句的。

@Test
	public void test_demo1() throws Exception {
		Session session = sessionFactory.openSession();
		Transaction tr = session.beginTransaction();
		User user = new User();//这里就是临时状态
		user.setName("张三");//临时状态
		tr.commit();
		session.close();
	}

 2、游离状态:它指的是数据库中有对用关系,但是不在session管理范围之外(也就是不受session管理),例子如下:

@Test
	public void test_demo2() throws Exception {
		Session session = sessionFactory.openSession();
		Transaction tr = session.beginTransaction();
		User user = (User) session.get(User.class, 7);//持久化状态
		user.setName("赵武");
		session.flush();//强制执行
		session.clear();//游离状态
		System.out.println("____________-----");
		tr.commit();
		session.close();
	}

 这里需要理解flush()方法,它代表强制执行,因为在更新操作中,更新是在commit();的时候才更新到数据库,当你对此对象运行了一次更新,在运行时就不会有更新,这个例子放在下面的的一段代码中,再看clear(),执行了它之后就将对象变为了游离状态,它的意思是晴空所有对象。

@Test
	public void test_demo2() throws Exception {
		Session session = sessionFactory.openSession();
		Transaction tr = session.beginTransaction();
		User user = (User) session.get(User.class, 8);//持久化状态
		user.setName("赵武");
		//session.flush();//强制执行
		//session.clear();//游离状态
		tr.commit();
		session.close();
	}

 3、持久化状态:它的意思就是将对象在session的管理之中,与数据对应着一定的关系,有主键(OID)。在操作的方法主要有,save() ,update(),saveOrUpdate()。例子如下:

@Test
	public void test_add() throws Exception {
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		User user = new User();// 临时状态
		user.setName("zhang");// 临时状态
		System.out.println("-----------");
		session.save(user);// 持久化状态
		user.setName("李四");//这里继续会执行
		System.out.println("=============");
		transaction.commit();
		session.close();
	}

 上面代码的user.setName("李四");在save()方法之后,但是它还会执行,执行顺是,先执行保存,打印了保存语句,在执行,修改语句,语句如下所示:

-----------
Hibernate: 
    insert 
    into
        sys_methed
        (name) 
    values
        (?)
=============
Hibernate: 
    update
        sys_methed 
    set
        name=? 
    where
        id=?

 4、删除状态:也就是执行了delete方法之后。打印删除的sql语句。但是要保证删除的id存在(一般是根据主键删除)。如果不存在就抛出异常,删除可以操作的状态有游离状态和持久化状态。删除两种状态的代码和sql语句如下:

 

@Test
	public void test_delete() throws Exception {
		Session session = sessionFactory.openSession();
		Transaction tr = session.beginTransaction();
		User user = (User) session.get(User.class, 8);//持久化状态
		session.delete(user);
		tr.commit();
		session.close();
	}
 
Hibernate: 
    select
        user0_.id as id0_0_,
        user0_.name as name0_0_ 
    from
        sys_methed user0_ 
    where
        user0_.id=?
Hibernate: 
    delete 
    from
        sys_methed 
    where
        id=?
上面先执行了查询,在执行了删除

 

@Test
	public void test_delete1() throws Exception {
		Session session = sessionFactory.openSession();
		Transaction tr = session.beginTransaction();
		User user = new User();//游离状态
		user.setId(3);//这里的id一定要在数据库中查找,不存在会报异常
		session.delete(user);
		tr.commit();
		session.close();
	}

 

Hibernate: 
    delete 
    from
        sys_methed 
    where
        id=?

 注意:这里只有一条sql语句。

你可能感兴趣的:(Hibernate)