Transient(瞬时状态) session没有,数据库没有
Persisent(持久状态) session有,数据库有
Detached(游离状态) session没有,数据库有
session的获得否封装在HibernateUtil里面,如下
public class HibernateUtil {
private static Configuration cfg=null;
private static SessionFactory factory=null;
private static Session session = null;
static{
cfg = new Configuration().configure();
factory = cfg.buildSessionFactory(new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties()).build());
}
public static Session getSession(){
if(factory!=null)
return session=factory.openSession();
factory=cfg.buildSessionFactory(new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties()).build());
return session=factory.openSession();
}
public static void closeSession(){
if(session!=null&&session.isOpen())
session.close();
}
}
这里用junit单元测试,项目右键build path →add libraries选junit
基本路线 new→save→close→update
public void testSave(){
Session session=null;
Transaction tx=null;
User user=null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
//构造对象--瞬时状态
user = new User();
user.setName("刘德华");
user.setPwd("2222");
//持久状态,user被session管理,并且id有值--oid
session.save(user);
//在持久状态下;脏数据检查:当提交事务,清理缓存时发现session中数据
//和数据库中数据不一致时,将会把session中的数据更新到数据库中
user.setName("学友");
//在保存以后 再修改对象 那么将会产生2条sql语句,那么效率较低,建议在save前修改
session.flush();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtil.closeSession();
}
//user:游离状态
System.out.println("姓名:"+user.getName());
user.setName("朝伟");
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
//持久状态
session.update(user);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtil.closeSession();
}
}
get/load→close get/load→clear,evict
load和get的区别(4.0以上版本):load和get都会立即查询对象,当查不到对象时,get返回null
@Test
public void testGet(){
Session session=null;
Transaction tx=null;
User user=null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
//持久状态
//get方法 相当于 之前的getById
//如果get查询的数据不存在,那么返回null
//get方法会立即查询数据(session--数据库)
user = (User)session.get(User.class, 1) ;
System.out.println(user);
user.setName("张三");
//System.out.println("姓名:"+user.getName());
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
//关闭session
HibernateUtil.closeSession();
}
//游离状态
user.setName("siggy");
System.out.println("============");
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
//持久
session.update(user);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
//关闭session
HibernateUtil.closeSession();
}
}
@Test
public void testLoad(){
Session session=null;
Transaction tx=null;
User user=null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
//持久状态
//load方法 相当于 之前的getById
//如果load查询的数据不存在,那么 抛出异常
user = (User)session.load(User.class,1) ;
//System.out.println(user);
System.out.println("姓名:"+user.getName());
tx.commit();
//clear清除所有session缓存中所有对象,evict清除指定对象
//user游离状态,不被session管理,数据库不会更改
session.clear();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtil.closeSession();
}
}
update 先获取对象再更新
也可以手动构建对象,也可以修改,但是如果指定的id不存在会报异常,而且构建对象必须指定所有属性,不建议使用。先获取对象再更新。
user = (User)session.get(User.class, 1);
user.setName("t_bag");
user.setPwd("3333");
session.update(user);
delete 先获取再删除
也可以手动指定id从数据库删除,但是如果id不存在也会报异常
user = (User)session.get(User.class, 1);
if(user!=null)
session.delete(user);
本文详细介绍了Hibernate中对象的三种状态:瞬时状态、持久状态和游离状态,并通过实例展示了如何使用Hibernate进行数据的保存、加载、更新和删除等操作。
6683

被折叠的 条评论
为什么被折叠?



