Hibernate的四种状态

   

 hibernate  四种状态:

 临时状态,持久化状态,游离状态 ,删除状态

如何区分Hibernate的几种状态:

 

1)对象是否在Session缓存中

2)在数据表中是否有记录

可以上述条件进行组合的形式来穷尽四种种状态,但是并不够完全合理。因为四个状态是可以进行转换的,以数据保存流程的形式来区分更为合理,同时也能够使这四种状态包含了对象可能的所有情况 , 

图示 :

 

 

    游离状态到持久化状态前提条件: session不能被关闭!!!!

  解决懒加载:hbm.xml 配置文件  <class 里面加上>  lazy="false"

1:如果对象是刚New出来的,那就是临时状态,这个时候是没有OID的,Session中无,数据库记录无;

2:如果这个时候进行了保存操作,或者从数据库中加载,就会变成持久化状态,这个时候有OID,Session中有,数据库记录有;

3:处于持久化状态,如果关闭Session,就会变成游离状态,这个时候有OID,Session中无,数据库中有(如果其他程序没有把它删除);

4:从持久化状态执行delete或者游离状态执行delete,变为删除状态,这个时候有OID,Session中有或者无,数据库记录无;

其实上面按照2) 中Session和数据库记录有、无的排列组合式也是可以区分的,只是不完全合理,同时有一种情况,即Session无而且数据库记录无的情况,可能是临时状态,也可能是删除状态。

  可以从代码中看到:

 

	// 状态  
	Configuration configuration=null;
	SessionFactory factory=null;
	Session session=null;
	Transaction transaction=null;
	@Test
	public void test01() {
		 configuration = new Configuration().configure();
		 factory = configuration.buildSessionFactory();
		 session = factory.openSession();
		 transaction=session.beginTransaction();
		
		 Users users =new Users();
		 users.setUserId("1");
		 users.setUserName("zs");
		 users.setUserPwd("123");
//		 save  不会认证主键ID 
//		 session.save(users);	 
//		 persist 认证主键ID 若不同则报错
		 session.persist(users);
		 transaction.commit();
		 session.close();
		 factory.close();
	}
	
	@Test
	public void test02() {
		 configuration = new Configuration().configure();
		 factory = configuration.buildSessionFactory();
		 session = factory.openSession();
		 transaction=session.beginTransaction();
//		get的方法在Session關閉后仍能使用
//		 Users users =session.get(Users.class, "4028ab2765a5ec410165a5ec422c0000");
//	    load的方法若要看见Sql语句则要关闭懒加载
		 Users users1 =session.load(Users.class, "4028ab2765a5ec410165a5ec422c0000");
//		 users.setUserName("zs");
//		 users.setUserPwd("123");
		
		 users1.setUserName("zs");
		 users1.setUserPwd("123");
//		 session.save(users);	 
		 session.save(users1);
		 transaction.commit();
		 session.close();
		 factory.close();
	}
	
	@Test
	public void test03() {
		 configuration = new Configuration().configure();
		 factory = configuration.buildSessionFactory();
		 session = factory.openSession();
		 transaction=session.beginTransaction();
		
		 Users users =session.load(Users.class, "1");
		 users.setUserName("zs");
		 users.setUserPwd("123");
//		 evict 将Session对象从Session中移除
		 session.evict(users);
//		 clear 重置Session 将Session里的东西清空
//		 session.clear();
//      close 关闭Session 使其进入close状态
//		 session.close();
		 //只要Session没有关闭则可以从游离状态转到持久化状态。
//		 session.update(users);
//		 session.save(users);
		 
		 transaction.commit();
		 session.close();
		 factory.close();
	}

 

  如有不足多指教!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值