Hibernate三种状态:瞬时状态、持久化状态、离线状态

摘要:
三种状态和瞬时状态的相互转换:一个对象刚刚创建,尚未保存在数据库中。持久状态:对象已保存在数据库中或刚从数据库中获得脱机状态。数据库中有一个对象方法的代码实例,但会话中没有一个。save():将对象从[瞬时状态]转换为[持久状态]Update():把对象从[暂时状态]转换成[持久状态】。因此,无论有多少次更新,都只会发送一条更新语句。get();load();list();uniqueResult();如果数据库中存在这样的对象,则该对象也将变为[持久状态]并由会话管理。

三种状态及相互转化

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

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

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

Hibernate三种状态:瞬时状态、持久化状态、离线状态第1张

方法的代码实例(下面代码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重复的该条数据)。

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

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

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

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

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

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

 1         session = sessionFactory.openSession();
 2         session.beginTransaction();
 3         TestUser user6 = session.get(TestUser.class, "1");
 4         TestUser user7 = session.load(TestUser.class, "2");
 5         @SuppressWarnings("unchecked")
 6         List<TestUser> user8List = session.createQuery("from TestUser").list();
 7         user6.setUserName("name1-update(5)");
 8         user7.setUserName("name2-update(5)");
 9         user8List.get(2).setUserName("name3-update(5)");
10         session.getTransaction().commit();
11         session.close();
12         // [输出LOG]
13         // 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=?
14         // Nov 17, 2017 3:14:20 PM org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateService
15         // INFO: HHH000397: Using ASTQueryTranslatorFactory
16         // Hibernate: select testuser0_.user_id as user_id1_0_, testuser0_.user_name as user_nam2_0_ from test_user testuser0_
17         // Hibernate: update test_user set user_name=? where user_id=?
18         // Hibernate: update test_user set user_name=? where user_id=?
19         // Hibernate: update test_user set user_name=? where user_id=?

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

 1         session = sessionFactory.openSession();
 2         session.beginTransaction();
 3         TestUser user9 = session.get(TestUser.class, "1");
 4         TestUser user10 = session.get(TestUser.class, "2");
 5         user9.setUserName("name1-update(6)");
 6         user10.setUserName("name2-update(6)");
 7         session.evict(user9);
 8         session.clear();
 9         session.getTransaction().commit();
10         session.close();
11         // [输出LOG]
12         // 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=?
13         // 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();使对象从[离线状态]转成[持久化状态]。

 1         session = sessionFactory.openSession();
 2         session.beginTransaction();
 3         TestUser user11 = session.get(TestUser.class, "1"); // 持久化状态
 4         user11.setUserName("name1-update(7)");
 5         session.evict(user11); // 离线状态
 6         session.update(user11); // 持久化状态
 7         session.getTransaction().commit();
 8         session.close();
 9         // [输出LOG]
10         // 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=?
11         // Hibernate: update test_user set user_name=? where user_id=?

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

 1         session = sessionFactory.openSession();
 2         session.beginTransaction();
 3         TestUser user12 = new TestUser("1", "name1");
 4         session.delete(user12);
 5         TestUser user13 = session.get(TestUser.class, "2");
 6         session.delete(user13);
 7         session.getTransaction().commit();
 8         session.close();
 9         // [输出LOG]
10         // Hibernate: select testuser_.user_id, testuser_.user_name as user_nam2_0_ from test_user testuser_ where testuser_.user_id=?
11         // 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=?
12         // Hibernate: delete from test_user where user_id=?
13         // Hibernate: delete from test_user where user_id=?

免责声明:文章转载自《Hibernate三种状态:瞬时状态、持久化状态、离线状态》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇OpenShift 4.2环境离线部署Operatorhub解决Idea 无法启动tomcat项目。unable to open debugger port , java.net.SocketException "socket closed"下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SQLServer更新语句要注意

在SQLServer中 update语句中对于表不能使用别名 eg:update table a set a.column="" where ... 这样在SQLServer中是不对(在oracle中可以),不能对表使用别名,这是为什么呢? 这是因为我们一直写的update更新语句都是简写过的,实际上正确的应该是这样的: update t set t.Co...

flask自定义session

根据内置session原理可以进行session的定制: #!/usr/bin/env python # -*- coding:utf-8 -*- import uuid import json from flask.sessions import SessionInterface from flask.sessions import SessionMix...

hive权限配置

基于CDH5.x的Hive权限配置 1、打开权限控制,默认是没有限制的 set hive.security.authorization.enabled=true; 2、配置默认权限 1 hive.security.authorization.createtable.owner.grants = ALL 2 hive.security.authoriz...

Servlet第六篇【Session介绍、API、生命周期、应用】

什么是Session Session 是另一种记录浏览器状态的机制。不同的是Cookie保存在浏览器中,Session保存在服务器中。用户使用浏览器访问服务器的时候,服务器把用户的信息以某种的形式记录在服务器,这就是Session 如果说Cookie是检查用户身上的”通行证“来确认用户的身份,那么Session就是通过检查服务器上的”客户明细表“来确认用...

利尔达CC3200模块烧写程序笔记

1. 硬件使用利尔达的CC3200模块,仿真下载器使用利尔达的FTDI仿真器,硬件完全兼容官方的仿真器。仿真器支持IAR的调试,单步运行等操作。 2. 硬件连接接线说明: RXD, TXD, GNG, VCC, RESET, SOP2,下载的时候SOP2引脚需要拉高,正常运行悬空。在左边的板子,上面焊接了复位按键和一个电阻,所以RESET引脚可以不练。...

防止刷新重复post提交

这段代码用于防止用户点“提交”按钮后点了刷新导致重复提交post请求。思路是写session,根据每次Session不同判断是不是重复提交。 1 <%@ Page Language="C#"AutoEventWireup="true"CodeFile="重复提交.aspx.cs"Inherits="重复提交" %> 2 3 <!DOC...