Hibernate学习(四):session.save()
来源:互联网 发布:走进科学知乎 编辑:程序博客网 时间:2024/05/16 01:37
一切的一切都要从数据的插入开始,没有数据的插入就没有数据来进行更新、删除和修改。在Hibernate中使用最频繁的用来插入数据的方法就是save()方法了。在Hibernate的官方API中对save方法的注释很简单:将指定的临时对象持久化,并首先指定一个标识符,也就是我们所说的OID,但是如果OID的生成策略是assigned的时候除外。
注释虽然很简单,但是却向我们披露了足够的信息。我们从输入、操作、输出对它进行分析。
1.输入:一个处于临时状态的对象。这并不是说我们不能使用持久化对象和游离对象做参数,只是说这样操作不合规范。就像男人穿裙子一样,不是说你不能穿,只是这样不合常理而已。
2.操作:首先根据指定的OID生成策略给临时对象生成一个OID,一般来说此时临时对象的OID是NULL,除非你使用了assign策略或者人为的指定了一个OID,但是事实证明这时没有用的;接着把这个对象置入缓存中,使它成为持久化对象;最后,计划一个insert语句,注意,只是计划,并没有执行,只有当Session清理缓存时才执行sql语句。
3.输出:一个持久化对象和一条sql语句,这个说法不是很准确,这样说只是为了便于理解而已。
就我的理解,save()方法就像魔兽中英雄在外面练级的时候,把野怪身上掉的宝物捡起来放在身上一样。
前面我们说人为指定OID是没有用的,可以通过如下的代码片段来进行验证:
Customer customer=new Customer();
customer.setId(3L);
session.save(customer);
System.out.println(customer.getId());
结果表明,程序最后输出的ID是根据标识符生成器生成的。另外还要注意的一点就是,当对象处于持久化状态时,不能再随意修改它的OID,否则Session在清理缓存时会抛出异常,如:
Customer customer=new Customer();
session.save(customer);
customer.setId(3L);
tx.commit();
此时程序抛出如下异常:org.hibernate.HibernateException: identifier of an instance of cn.edu.hust.cm.mypack.Customer was altered from 7 to 3
我还做了如下一个实验,代码片段如下:
Customer customer=new Customer();
session.save(customer);
session.save(customer);
tx.commit();
第一次调用save()方法时customer处于临时状态,而第二次调用save()方法是时它已经处于持久化状态了,事实证明第二次的save操作完全是多余的,Hibernate并没有为它再计划一个insert语句。
- Hibernate学习(四):session.save()
- Hibernate学习(四):session.save()
- Hibernate学习(四):session.save()
- Hibernate Session的save()方法
- Hibernate Session的save()方法
- Hibernate Session的save()方法
- hibernate中的session.save无法保存数据
- Hibernate数据保存——Session.save
- hibernate,session.save(entity)和transaction.commit()
- Hibernate学习篇11——session方法之save与persist
- Hibernate学习篇12——session方法之save与update
- session.save
- session.save()
- hibernate里session.clear(),session.close(),session.flush(),session.save()的含义
- Hibernate中Session.save()方法的返回值是什么
- Hibernate中Session.save()方法的返回值是什么
- Hibernate中Session.save()方法的返回值
- Hibernate Session中的save(),update(),delete(),saveOrUpdate() 细粒度分析
- Hibernate学习(二):heibernate核心接口
- 师兄师姐他们毕业了
- Hibernate学习(三):Session的缓存及对象的状态
- 张昊轩百天
- 操作系统学习笔记(21)--中断描述符表设置
- Hibernate学习(四):session.save()
- 经典笔试面试题——宏macro
- Hibernate学习(四):session.save()
- datawindow的四个缓冲区
- Hibernate学习(五):session.update
- 写个文章为了积分啊!
- union, struct, enum 的 大小区别
- seo=更多页面的收录+页面文字的友好安排+转化率
- Hibernate学习(六):session.delete以及对象状态转换图