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();
}
如有不足多指教!