Hibernate 数据的三种状态

hibernate 数据的三种状态

①、临时状态       使用 new语句创建出来的对象 属于 "临时状态",数据只存在与内存中的,目前数据还未存放到数据库中

②、持久化状态   临时状态的数据,使用 save() 或者 saveOrUpdate() 方法,可以将数据从 "临时状态" 转变成 "持久化状态"

③、游离状态  持久化状态的数据,可以使用 evict() 或者 close() 或者 clear() 方法,将数据从 "持久化状态" 转换为 "游离状态"

                       游离状态的数据,可以使用update() 或者 saveOrUpdate() 或者 lock() 方法,将数据从 "游离状态" 转换为 "持久化"


联想记忆:
临时状态 可以理解为 单身状态
持久化状态 可以理解为 已婚状态
游离状态 可以理解为 离异状态 
1、人在最初的时候都是单身状态
2、通过结婚,人才能从原来的单身状态 转变 到已婚状态
3、已婚状态的部分人,由于某种原因要分开,分开后的人将由已婚状态 转变为 离异状态
4、离异的人的部分人,由于某种特殊的需求,需要从离异状态 转变为 已婚状态


一、临时状态

临时状态对象特征:

①、使用 new 创建出来的对象,没有设置 id 属性

②、没有被 session 托管,换句话说 对象数据 存放在内存中, 没有存放到 session 缓存中

③、临时对象数据 与 数据库中的数据 还没任何关联

二、持久状态

持久状态对象特征:

①、要么是从数据库中使用 get 或 load 方法查询到的数据对象, 要么是 使用save 或 update 方法数据转变成持久层对象

②、对象 数据被 session 托管。换句话说 对象数据 在 session 缓存中有一份,在数据库中有相应的记录

三、游离状态

游离状态对象特征:

①、主要是通过 持久状态对象,调用 session.evict() 或 session.clear() 或 session.close() 得到的,也可以new 一个设置 id 值的对象

②、session 缓存中没有,内存中有的对象(注: 该对象设置了 id 值)

 

Hibernate 数据的三种状态_第1张图片


测试公共代码

        SessionFactory sessionFactory;
	Session session;
	Transaction transaction;
	
	@Before
	public void init(){
		Configuration cfg = new Configuration().configure();
		ServiceRegistry reg = cfg.getStandardServiceRegistryBuilder().build();
		sessionFactory = new MetadataSources(reg).buildMetadata().buildSessionFactory();
		session = sessionFactory.openSession();
		transaction = session.beginTransaction();
	}
	
	@After
	public void destory(){
		session.flush();
		transaction.commit();
		session.close();
		sessionFactory.close();
	}

 

案例1、 

	@Test
	public void test5(){
		Student student = new Student("zs",18);
		session.save(student);
		student.setName("zwj");
	}

Hibernate 数据的三种状态_第2张图片

PS:①、Student student = new Student("zs",18); 内存中会创建 student 对象
        ②、session.save(student); 将 student 对象交给 session托管,此时会在session 缓存中存放一份,同时发起 insert 语句将数据存放到数据库
        ③、student.setName("zwj"); 内存中的数据发生了修改(可以是多次修改),此时 内存中的student 对象 与 session缓存中的 student 对象是不一致的
        ④、transaction.commit(); 当执行 commit() 方法时,会默认先调用 flush() 方法,将数据同步到数据库中。此时如果 缓存中的数据 与 数据库中的数据不一致,会发送一条update 语句


案例2、

	@Test
	public void test6(){
		Student student = new Student();//临时状态
		student.setId(new Long(100));
		student.setName("珠穆朗玛");
		session.save(student);
	}
    @Test
	public void test7(){
		Student student = new Student();//临时状态
		student.setName("好好学习");
		session.save(student);
		student.setId(new Long(989));
	}

Hibernate 数据的三种状态_第3张图片

 Hibernate 数据的三种状态_第4张图片

PS: session.save() 方法之前设置对象的id 是无效的, 方法之后设置对象id 会报错,报错原因是持久化对象的 id 是不能修改


 案例3、

	@Test
	public void test8(){
		Student student = new Student();//临时状态
		student.setId(new Long(7));//找一个数据库里有的数据
		session.delete(student);
	}

Hibernate 数据的三种状态_第5张图片

PS:构造一个有id值的对象, 然后调用session.delete() 方法删除,如果该对象在 session 缓存中有, 那么会先删除 session 缓存中的数据,然后再删除数据库中的数据


案例4、(session.saveOrUpdate())

        @Test
	public void test9(){
		Student student = new Student("海绵宝宝12",12);//临时状态
		student.setId(new Long(120));//从临时状态 到 游离状态
		session.saveOrUpdate(student);
	}

Hibernate 数据的三种状态_第6张图片

PS:saveOrUpdate 方法是save 方法 和 update 方法结合, 如果对象有 id 那么就调用 update 方法,如果没有id 那么就调用save 方法, 但前提是这个 对象是 在session 缓存中的(换句话说, 自己手工设置的 id 值是不行的)


案例5、(session.saveOrUpdate())

	@Test
	public void test11(){
		Student st2 = new Student("12", 12);//临时状态
		session.saveOrUpdate(st2);
	}

Hibernate 数据的三种状态_第7张图片


 案例6、(session.saveOrUpdate())

	@Test
	public void test10(){
		Student student = session.get(Student.class, new Long(10));
		student.setName("xyz");
		session.saveOrUpdate(student);
	}

Hibernate 数据的三种状态_第8张图片


总结:

①、session.save(obj) 方法通常用于保存新对象,即没有 id 值的对象,因为即使手动设置id值,在save() 到数据库也不会使用这个 id 值。

②、session.update(obj) 这个方法通常用于更新 数据对象,数据对象通常都在 session 缓冲中存在的。即是 使用 load 或 get 方法得到的 数据对象

③、session.delete(obj) 方法通常用于删除对象,可以构建一个有 id 值的对象,然后删除。需要注意的是 这个id 值在数据库中必须存在,否则会报错

④、session.saveOrUpdate(obj); 这个方法通常不使用,因为手工设置id 执行该方法会报错,get 方法得到的数据对象,经常出现无法更新

你可能感兴趣的:(hibernate)