本系列博客汇总在这里:Hibernate 汇总
对象的三种状态
源码工程文件为:hibernate4.3_02
一、hibernate 的对象的三种状态
1、瞬时对象(transientObjects):由我们自己创建出来,数据库中没有相应的记录,也没有被hibernate 的 Session 管理起来,这样的对象可以被 jvm 回收的。
2、持久化对象(persistentObjects):这个对象在数据库中有相应的记录,这个对象被 Session 管理起来。
3、脱管对象(detachObjects):数据库中有相应的记录,但是没有被 Session 管理。
二、瞬时对象转换成持久对象
对持久对象的修改
public void test2()
{
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
try
{
// 创建对象,这时是瞬时对象
User user = new User();
user.setUname("魏宇轩");
user.setGender(1);
user.setBirthday(new Date());
// 发出sql语句,把user对象纳入到Session的管理,并且保存到数据库,持久状态
session.save(user);
// 设置持久对象的属性,Session会把修改后的持久
// 对象的属性值和没有修改时的做对比,如果有变化就发出update,没有就不发
user.setUname("轩哥");
tx.commit();
} catch (Exception e)
{
e.printStackTrace();
tx.rollback();
} finally
{
HibernateUtils.closeResource(session);
}
}
三、持久对象和脱管对象的转换
public void test3()
{
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
User user = new User();
try
{
user.setUname("魏宇轩");
user.setGender(1);
user.setBirthday(new Date());
session.save(user);
tx.commit();
} catch (Exception e)
{
e.printStackTrace();
tx.rollback();
} finally
{
// Session关闭,那么user由持久对象变成脱管对象
HibernateUtils.closeSession(session);
}
Session session1 = HibernateUtils.getSession();
Transaction tx1 = session1.beginTransaction();
try
{
user.setUname("轩哥");
tx1.commit();
} catch (Exception e)
{
e.printStackTrace();
tx1.rollback();
} finally
{
HibernateUtils.closeResource(session1);
}
}
public void test4()
{
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
User user = new User();
try
{
user.setUname("魏宇轩");
user.setGender(1);
user.setBirthday(new Date());
session.save(user);
tx.commit();
} catch (Exception e)
{
e.printStackTrace();
tx.rollback();
} finally
{
// Session关闭,那么user由持久对象变成脱管对象
HibernateUtils.closeSession(session);
}
Session session1 = HibernateUtils.getSession();
Transaction tx1 = session1.beginTransaction();
try
{
user.setUname("轩轩");
// Session1接纳了user,立即把user变成持久对象
session1.update(user);
tx1.commit();
} catch (Exception e)
{
e.printStackTrace();
tx1.rollback();
} finally
{
HibernateUtils.closeResource(session1);
}
}
四、通过 get 和 load 和 iterator 查询出来的对象是持久状态
public void test5()
{
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
try
{
// 通过get方法查询的对象既在Session管理中,在数据库中也有记录所以user是持久对象
User user = (User) session.get(User.class, 1);
System.out.println(user);
user.setUname("xuanxuan");
// 发出update语句,证明是持久对象
tx.commit();
} catch (Exception e)
{
e.printStackTrace();
tx.rollback();
} finally
{
HibernateUtils.closeSession(session);
}
}
public void test6()
{
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
try
{
// 通过get方法查询的对象既在Session管理中,在数据库中也有记录所以user是持久对象
User user = (User) session.load(User.class, 5);
System.out.println(user);
user.setUname("魏宇轩");
// 发出update语句,证明是持久对象
tx.commit();
} catch (Exception e)
{
e.printStackTrace();
tx.rollback();
} finally
{
HibernateUtils.closeSession(session);
}
}
五、持久和脱管对象转换瞬时对象
通过 delete 把数据库中的数据删除,而且清掉 Session 中的对象,那么这个对象就变成了瞬时对象。
public void test7()
{
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
try
{
// 通过get方法查询的对象既在Session管理中,在数据库中也有记录所以user是持久对象
User user = (User) session.get(User.class, 1);
System.out.println(user);
// session的删除会把数据库中的记录删掉,同时清掉Session的user对象
session.delete(user);
tx.commit();
} catch (Exception e)
{
e.printStackTrace();
tx.rollback();
} finally
{
HibernateUtils.closeSession(session);
}
}
如有错误,欢迎指正!