各种状态定义
瞬时态:没有交给session管理,在数据库中也没有这个对象
持久态:对象交给session管理,最终数据库中会有这个对象
游离态:对象没有交给session管理,但数据库中有这个对象
删除态:执行delete()方法后的对象
session方法之save方法
测试一
@Test
public void testOne() {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// user对象已经产生,此时是临时状态-没有交给Session管理,和数据库没有关联(数据库中没这个对象)
User user = new User();
// 此时仍然是临时状态
user.setName("悟空");
// 持久状态,user对象交给session管理,且数据库中没有这条记录
session.save(user);
// 由于此时user对象是持久状态,即由session管理,所以此时仍然会更新进数据库
user.setName("八戒");
transaction.commit();
session.close();
// 此时由于session已经关闭,但数据库中已经有了user这个对象,所以是游离状态
// 得到的结果为八戒
System.out.println(user.getName());
}
测试二
public void testOne() {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// user对象已经产生,此时是临时状态-没有交给Session管理,和数据库没有关联(数据库中没这个对象)
User user = new User();
// 此时仍然是临时状态
user.setName("悟空");
// 持久状态,user对象交给session管理,且数据库中没有这条记录
session.save(user);
// 由于此时user对象是持久状态,即由session管理,所以此时仍然会更新进数据库
transaction.commit();
session.close();
// 此时由于session已经关闭,但数据库中已经有了user这个对象,所以是游离状态
// 数据库中插入的第二条数据名称为悟空,session已经关闭,不会更新进数据库
user.setName("八戒");
System.out.println(user.getName());
}
测试三
public void testSave() {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User user = new User();
user.setName("牛魔王");
// 此时只会产生一个insert语句,只会插入一次,save()方法把临时状态转换为持久化状态,即交给session管理,放在session的缓存里面
// 并不是每个save方法都会产生一个insert语句,如果有多个save方法,会先检查session域中有没有这个对象,不会重复插入
session.save(user);
session.save(user);
session.save(user);
session.save(user);
session.save(user);
session.save(user);
transaction.commit();
session.close();
}
session方法之update方法
测试四
public void testUpdate() {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// 将数据库中的游离状态转化为持久化状态
User user = (User)session.get(User.class, 1);
// 此时对user对象所做的改变会同步到数据库中
System.out.println(user.getName());
// 清空session域中的对象,此时user变成游离状态
session.clear();
// 游离状态下,对对象所做的修改不会更新到数据库中,不会有update语句生成
user.setName("如来佛祖");
transaction.commit();
session.close();
}
测试五
public void testUpdate() {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// 将数据库中的游离状态转化为持久化状态
User user = (User)session.get(User.class, 1);
// 此时对user对象所做的改变会同步到数据库中
System.out.println(user.getName());
user.setName("如来佛祖");
// 强制刷新,将session域中的对象强制刷出进数据库
// update语句是在commit()方法执行时产生的
// 如果不写flush方法,默认是在commit方法执行的时候刷新进数据库
session.flush();
// 清空session域中的对象,此时user变成游离状态
session.clear();
transaction.commit();
session.close();
}
测试六
session.evict(user); 此方法清空session域中一个指定的一个对象
public void testUpdate() {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// 将数据库中的游离状态转化为持久化状态
User user = (User)session.get(User.class, 1);
// 清空session域中所有的对象,此时user变成游离状态,即session域中没有对象
session.clear();
// 游离状态下,对对象所做的修改不会更新到数据库中 即下面所做的修改不会有效果
user.setName("如来佛祖");
// 强制刷新,将session域中的对象强制刷出进数据库
// update语句是在commit()方法执行时产生的
// 如果不写flush方法,默认是在commit方法执行的时候刷新进数据库
// 因为此时session域中没有对象,所以没有update语句产生
session.flush();
transaction.commit();
session.close();
}
测试七
public void testUpdate() {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// 将数据库中的游离状态转化为持久化状态
User user = (User)session.get(User.class, 2);
// 清空session域中的user对象,此时user变成游离状态
session.evict(user);
// 游离状态下,对对象所做的修改不会更新到数据库中 即下面所做的修改不会有效果
user.setName("如来佛祖");
// 调用session域中的update方法,将游离状态的user转为持久化状态
session.update(user);
transaction.commit();
session.close();
}
session方法之saveOrUpdate方法
执行delete()方法后的对象。
操作实体对象的方法
save()
update()
saveorupdate()
delete()
操作缓存的
clear()
evcit()
flush()
查询实体对象的
get()
load()
createQuery()
createCriteria()
测试八
// 先执行插入语句,再执行输出语句
public void testOne() {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// user对象已经产生,此时是临时状态-没有交给Session管理,和数据库没有关联(数据库中没这个对象)
User user = new User();
user.setName("无法无天");
// 一般来说,sql语句的执行是在commit方法执行的时候生成的
// 不过也有例外,比如save方法,因为user对象在保存之前,没有id,保存之后才有id,
// id是由数据库生成的,所以为了得到主键值,会马上执行插入语句,生成id
session.save(user);
System.out.println("我爱中国");
transaction.commit();
session.close();
}
测试九
// 打印语句是在update语句之前执行,即commit方法执行之前
public void testUpdate() {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// 将数据库中的游离状态转化为持久化状态
User user = (User)session.get(User.class, 3);
// 游离状态下,对对象所做的修改不会更新到数据库中 即下面所做的修改不会有效果
user.setName("如来佛祖");
// 调用session域中的update方法,将游离状态的user转为持久化状态
session.update(user);
System.out.println("华夏民族");
transaction.commit();
session.close();
}
测试十
测试十一
测试游离态对象的更新,saveOrUpdate方法,游离态,即数据库中有这个对象,而session域中没有这个对象
已知数据库中有id为1的对象
更新的时候 如果对象不存在 会报错
本方法更新的时候,会根据id判断对象是什么状态,如果是原始值(对象是null,原始类型数字是0),就是临时状态
如果不是原始值,就是游离状态。
user.setId(null),此时user就是临时状态
测试十二
测试十三
删除持久化对象
测试十四
删除游离态对象
如果删除的对象不存在,会报错
session方法之get与load方法
get和load方法,获取对象,会马上执行sql语句,因为接下来的代码中可能要用到这个对象
load:懒加载,不会马上执行sql语句,而是在第一次使用非id或class属性时才会执行,获取的时候
已经写明了class与id,所以没必要再去数据库查这两个属性值
load后返回的是代理对象,而get放法返回的是真正的对象
如果对象不存在,get会返回null,而load会报错
让懒加载失效的方式有两种
方式一:
配置文件hbm.xml中<class name="User" table="user" lazy="false">
方式二:
实体类中,public final class User{} 使其无法被继承生成代理类对象
lazy属性默认为true,表示可以懒加载
返回值 如果数据不存在
get 立即加载 返回真实对象或null 返回null
load 懒加载 返回代理对象 抛异常
操作大量数据,要防止session中对象太多,从而导致内存溢出,所以要先flush刷出,再用clear清除缓存