session的管理:
1)save():把临时状态变为持久化状态(交给Sessioin管理)
Session session = sessionFactory.openSession();
session.beginTransaction();
// --------------------------------------------
User user = new User(); // 临时状态
user.setName("test");
session.save(user); // 变为了持久化状态
// --------------------------------------------
session.getTransaction().commit();
session.close();
user.setName("李四"); // 游离状态
System.out.println(user.getName()); // 游离状态
2)update():把游离状态变为持久化状态
在更新时,对象不存在就报错
session.clear(); // 清除Session中所有的对象
session.evict(user); // 清除Session中一个指定的对象
3)saveOrUpdate():把临时或游离状态转为持久化状态
在更新时,对象不存在就报错
本方法是根据id判断对象是什么状态的:如果id为原始值(对象的是null,
原始类型数字是0)就是临时状态,如果不是原始值就是游离状态。
User user = new User();
user.setId(3); // 自己生成一个游离状态对象
user.setName("newName");
session.saveOrUpdate(user);//持久化对象
4)delete():把持久化或游离转为删除状态
如果删除的对象不存在,就会抛异常
5)get():获取数据,是持久化状态
会生成:select ... where id=?
会马上执行sql语句
如果数据不存在,就返回null
6)load():获取数据,是持久化状态
load()后返回的是一个代理对象,要求类不能是final的,否则不能生成子
类代理,就不能使用懒加载功能了。
让懒加载失效的方式:
一、把实体写成final的;
二、在hbm.xml中写<class ... lazy="false">
不会马上执行sql语句,而是在第1次使用非id或class属性时执行sql。
如果数据不存在,就抛异常:ObjectNotFoundException
7)操作大量数据,要防止Session中对象过多而内存溢出
for (int i = 0; i < 30; i++) {
User user = new User();
user.setName("测试");
session.save(user);
if (i % 10 == 0) {
session.flush(); // 先刷出
session.clear(); // 再清空
}
}
user = (User) session.get(User.class, 5); // 持久化
// 刷新Session缓存中对象的状态,即重新select一下
上session.refresh(user);