三种状态及相互转化

瞬时状态(transient):刚new出来一个对象,还没有被保存到数据库中

持久化状态(persistent):已经被保存到数据库中或刚从数据库中取得

离线状态(detached):数据库中有,但是session中不存在该对象

方法的代码实例(下面代码1-8是连贯的,但由于需要分条说明,因此拆开)

(1) save():把一个对象从[瞬时状态]转换成[持久化状态](要注意DB里没有ID重复的该条数据)。

        SessionFactory sessionFactory = SessionFactoryBuilder.getInstance();
Session session = sessionFactory.openSession();
session.beginTransaction();
TestUser user1 = new TestUser("1", "name1"); // user变成瞬时状态
session.save(user1); // user变成持久化状态
session.getTransaction().commit(); // 发出insert语句
session.close();
// [输出LOG]
// Hibernate: insert into test_user (user_name, user_id) values (?, ?)

(2) update():把一个对象从[瞬时状态]转换成[持久化状态](要注意DB里要有ID重复的该条数据)。

         session = sessionFactory.openSession();
session.beginTransaction();
TestUser user2 = new TestUser("1", "name1-update(2)");
session.update(user2);
session.getTransaction().commit();
session.close();
// [输出LOG]
// Hibernate: update test_user set user_name=? where user_id=?

(3) saveOrUpdate():当(1)(2)中不确定DB里是否有ID重复的该条数据时可以用saveOrUpdate()。

         session = sessionFactory.openSession();
session.beginTransaction();
TestUser user3 = new TestUser("1", "name1-update(3)");
TestUser user4 = new TestUser("2", "name2");
session.saveOrUpdate(user3);
session.saveOrUpdate(user4);
session.getTransaction().commit();
session.close();
// [输出LOG]
// Hibernate: select testuser_.user_id, testuser_.user_name as user_nam2_0_ from test_user testuser_ where testuser_.user_id=?
// Hibernate: select testuser_.user_id, testuser_.user_name as user_nam2_0_ from test_user testuser_ where testuser_.user_id=?
// Hibernate: insert into test_user (user_name, user_id) values (?, ?)
// Hibernate: update test_user set user_name=? where user_id=?

(4) 一个commit内先save再多次update,commit时只会做一次insert和一次update。

         session = sessionFactory.openSession();
session.beginTransaction();
TestUser user5 = new TestUser("3", "name3");
session.save(user5);
user5.setUserName("name3-update(4)-1");
session.update(user5); // 该条语句可省略
user5.setUserName("name3-update(4)-2");
session.update(user5); // 该条语句可省略
user5.setUserName("name3-update(4)");
// 在调用了save方法后,此时user已经是持久化对象了,被保存在了session缓存当中,
// 这时user又重新修改了属性值,那么在commit时,此时hibernate对象就会拿当前这个user对象和保存在session缓存中的user对象进行比较,
// 如果两个对象相同,则不会发送update语句,否则,如果两个对象不同,则会发出update语句。所以无论多少次update,最终只会发送一次update语句。
session.getTransaction().commit();
session.close();
// [输出LOG]
// Hibernate: insert into test_user (user_name, user_id) values (?, ?)
// Hibernate: update test_user set user_name=? where user_id=?

(5) get();load();list();uniqueResult();等查询语句,如果数据库中有该对象,则该对象也变成了[持久化状态],被session所托管。

         session = sessionFactory.openSession();
session.beginTransaction();
TestUser user6 = session.get(TestUser.class, "1");
TestUser user7 = session.load(TestUser.class, "2");
@SuppressWarnings("unchecked")
List<TestUser> user8List = session.createQuery("from TestUser").list();
user6.setUserName("name1-update(5)");
user7.setUserName("name2-update(5)");
user8List.get(2).setUserName("name3-update(5)");
session.getTransaction().commit();
session.close();
// [输出LOG]
// Hibernate: select testuser0_.user_id as user_id1_0_0_, testuser0_.user_name as user_nam2_0_0_ from test_user testuser0_ where testuser0_.user_id=?
// Nov 17, 2017 3:14:20 PM org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateService
// INFO: HHH000397: Using ASTQueryTranslatorFactory
// Hibernate: select testuser0_.user_id as user_id1_0_, testuser0_.user_name as user_nam2_0_ from test_user testuser0_
// Hibernate: update test_user set user_name=? where user_id=?
// Hibernate: update test_user set user_name=? where user_id=?
// Hibernate: update test_user set user_name=? where user_id=?

(6) evict();clear();close();将session的缓存对象清空evict()清除指定对象;clear()&close()清除所有对象。它们使对象从[持久化状态]变成[离线状态]。

         session = sessionFactory.openSession();
session.beginTransaction();
TestUser user9 = session.get(TestUser.class, "1");
TestUser user10 = session.get(TestUser.class, "2");
user9.setUserName("name1-update(6)");
user10.setUserName("name2-update(6)");
session.evict(user9);
session.clear();
session.getTransaction().commit();
session.close();
// [输出LOG]
// Hibernate: select testuser0_.user_id as user_id1_0_0_, testuser0_.user_name as user_nam2_0_0_ from test_user testuser0_ where testuser0_.user_id=?
// Hibernate: select testuser0_.user_id as user_id1_0_0_, testuser0_.user_name as user_nam2_0_0_ from test_user testuser0_ where testuser0_.user_id=?

(7) update();saveOrUpdate();使对象从[离线状态]转成[持久化状态]。

         session = sessionFactory.openSession();
session.beginTransaction();
TestUser user11 = session.get(TestUser.class, "1"); // 持久化状态
user11.setUserName("name1-update(7)");
session.evict(user11); // 离线状态
session.update(user11); // 持久化状态
session.getTransaction().commit();
session.close();
// [输出LOG]
// Hibernate: select testuser0_.user_id as user_id1_0_0_, testuser0_.user_name as user_nam2_0_0_ from test_user testuser0_ where testuser0_.user_id=?
// Hibernate: update test_user set user_name=? where user_id=?

(8) delete();从[瞬时状态]和[持久化状态]都可以删除。

         session = sessionFactory.openSession();
session.beginTransaction();
TestUser user12 = new TestUser("1", "name1");
session.delete(user12);
TestUser user13 = session.get(TestUser.class, "2");
session.delete(user13);
session.getTransaction().commit();
session.close();
// [输出LOG]
// Hibernate: select testuser_.user_id, testuser_.user_name as user_nam2_0_ from test_user testuser_ where testuser_.user_id=?
// Hibernate: select testuser0_.user_id as user_id1_0_0_, testuser0_.user_name as user_nam2_0_0_ from test_user testuser0_ where testuser0_.user_id=?
// Hibernate: delete from test_user where user_id=?
// Hibernate: delete from test_user where user_id=?

最新文章

  1. qlikview 扩展插件制作教程-EchartsGeoMap
  2. Codeforces Round #258 (Div. 2)(A,B,C,D)
  3. DB2对年份的处理Year()
  4. 用sinopia搭建npm私服
  5. Beyond Compare 相同文件对比结果仍显示红色 解决方案
  6. 分布式数据库中间件–(3) Cobar对简单select命令的处理过程
  7. Python3 函数式编程
  8. 根据标点符号分行,StringBuilder的使用;将字符串的每个字符颠倒输出,Reverse的使用
  9. jQuery 分割按钮(Split Button)
  10. pyqt一个简单的动画
  11. HTTP协议一次上传多个文件的方法
  12. iOS发展 - 使用您自己的自定义字体
  13. ubuntu server 11.10 mysql 自动备份脚本
  14. lua 模块
  15. ASP.NET没有魔法——ASP.NET Identity与授权
  16. JAVA面对对象(三)——Super、static、final关键字
  17. jest &amp; puppeteer &amp; 单元测试 &amp; 集成测试
  18. 第四百节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署CentOS6.5安装python3.5.1
  19. [Windows] [Firewall] 增加进入规则
  20. 《设计模式》-原则五:合成/聚合复用原则(CARP)

热门文章

  1. Linux的基础使用命令
  2. mpvue打小程序预览码
  3. python 上传多文件
  4. 洛谷P1006 传纸条【dp】
  5. C# ado.net oledb方式连接(三)
  6. 剧终—AFO.
  7. go面试
  8. Could not initialize class sun.awt.X11GraphicsEnvironment异常处理
  9. 最小n个和(优先队列)
  10. python上下文小记