首页 > 数据库 >hibernate——和数据库关联的对象的三种状态

hibernate——和数据库关联的对象的三种状态

时间:2023-08-27 11:04:28浏览次数:30  
标签:hibernate 对象 数据库 session 三种 user import


和数据库关联的对象有三种状态:瞬时,持久,脱管。

瞬时:在数据库中还没有与该对象关联的记录,仅仅是一个普通的对象而已,超过作用域,就会被回收。一般都是new出来的对象,并且还没有与session建立联系。

持久:与session建立了联系,并且在数据库中已经有了和该对象关联的记录,并且session没有关闭,事务没有提交,处于持久状态的对象,其状态改变,hibernate会检测到,在进行提交时,会影响到数据库中该对象对应的记录。但是,应注意,若是session没有关闭,但事务已经提交,那么当前对象仍然处于持久状态,不过,对象状态的改变不会影响到数据库,只要再开启一个事务,在提交时,就会影响到数据库了。

脱管:数据库中已有记录和这个对象对应,但是当前已经和session失去了关联,此时,若对象发生改变,不会影响到数据库。


如下例:

package com.suo.test;

import java.util.Date;

import org.hibernate.HibernateException;
import org.hibernate.Transaction;
import org.hibernate.Session;

import com.suo.domain.User;
import com.suo.hibernate.HibernateUtil;

public class Test {

	public static void main(String[] args) {
		
		User user=new User();
		
		user.setBirthday(new Date());
		user.setName("suo");
		
		//此时的user对象是瞬时状态(Transient)
		
		addUser(user);
		
		//此时的user对象是脱管的(Detached)
		
	}
	
	public static void addUser(User user){
		Session session=null;
		Transaction transaction=null;
		
		try{
			session=HibernateUtil.getSession();//获得一个连接
			transaction=session.beginTransaction();//开启一个事务
			
			session.save(user);
			
			user.setName("piao");
			
			//此时的user对象是持久的(Persistent)
			
			transaction.commit();/*设置为自动提交,因为hibernate默认的设置为不自动提交,这时候使用的数据库引擎为InnoDB,支持事务*/
			
		}catch(HibernateException e){
			if(transaction!=null){
				transaction.rollback();
			}
			e.printStackTrace();
		}finally{
			if(session!=null){
				session.close();
			}
		}
	}
}

注意:在addUser方法中,在session.save(user)之后,对象的状态改变了,由于此时还没有进行事务的提交,并且还和session保持着关联,所以,对象此时处于持久状态,所以,user名字的改变,也会反映到数据库中,数据库中的name,不是之前的suo,而是修改之后的piao。



这三种状态之间转换的关系如下图:

hibernate——和数据库关联的对象的三种状态_数据库



(摘自李勇老师的课件)



标签:hibernate,对象,数据库,session,三种,user,import
From: https://blog.51cto.com/u_5173797/7251438

相关文章

  • 实现拦截器的三种方法
    说是三种方法,实际上是一种方法,其实只要这个类实现了Interceptor接口,即可成为一个拦截器类。第一种方法就是直接实现Interceptor接口,这样的话,就要实现这个接口中的三个方法。第二种方法是继承自AbstractInterceptor类,这是个抽象类,实现了Interceptor接口,并且对里面的init()和destroy(......
  • hibernate——一对一、多对一和多对多关系的比较
    现在学习完了这几种映射关系,但是有点乱,这里来小结一下。关键是表之间如何产生映射关系,以及产生的表的结构。1、一对一映射:一对一是通过one-to-one标签来产生映射关系的,其实,如果单单说是建立两个表之间的关联,只要在一个映射文件中配置one-to-one标签就可以了,在另一个映射文件中,也做......
  • oracle学习笔记(13)——数据库的启动与关闭
    1、常用的服务(1)OracleServiceSID     数据库服务,这个服务会自动地启动和停止数据库。如果安装了一个数据库,它的缺省启动类型为自动。服务进程为ORACLE.EXE,参数文件initSID.ora,日志文件SIDALRT.log,控制台SVRMGRL.EXE、SQLPLUS.EXE。     注:SID-数据库标识 ......
  • oracle学习笔记(12)——数据库服务器工作模式与数据字典
    1、 专用服务器工作模式    1)概念:       专用服务器模式是指Oracle为每个用户进程启动一个专门的服务器进程,该服务器进程仅为该用户进程提供服务,直到用户进程断开连接时,对应的服务器进程才终止。    2)特点:       服务器进程与客户进......
  • 数据库基本语法四 数据库查询(DQL)
    数据查询语言(DQL)是SQL语言中的一部分,主要用于查询数据库中的数据。DQL允许用户根据特定的条件来检索表中的数据,并且可以包含一些基本的操作和条件。语法结构:SELECT列名称1,列名称2FROM表名称;其中,SELECT指定要检索的列,FROM指定要查询的表,WHERE指定筛选条件。以下是一些......
  • 数据库的类型
    一说到数据库,大多数人可能像我一样,首先想到的就是MySQL、Oracle这样的关系型数据库。因为我们平时接触的最多,而且大学课程中有关于数据库的,也是以关系型数据库为主的。其实,除了关系型数据库外,还有其他类型的用作数据存储的结构,也可以叫做数据库。有些我们平时也经常用到,有的呢,......
  • VBS中解决路径带空格的三种方法
    方法一Setwshell=CreateObject("WScript.Shell")wshell.Run """C:\ProgramFiles\360\360se\360se.exe""",5,TrueSetwshell=Nothing 备注说明:命令格式:object.Run(strCommand,[intWindowStyle],[bWaitOnReturn])因为strComman......
  • 最短路三种算法详解
    最短路最短路问题即,给你一张图,让你求出图中两点的最短距离。这篇文章会讲解\(Dijkstra\)、\(Spfa\)、\(Floyd\)三种算法,让您透彻理解最短路!Dijkstra朴素版题目:\(Dijkstra\)通常是用来解决图中一个定点到其余点的最短距离,基本思路是:从中心向外扩展,直到扩展到终点为止。......
  • 用Python制作一个自动点击器,三种模块都可以
    顾名思义,Python中的自动点击器是一个简单的Python应用程序,可以按照用户的要求重复点击鼠标。不同的参数,如速度、频率和位置,可以根据用户的要求进行改变。Python有不同的模块可用于控制键盘、鼠标等设备。因此,我们可以使用这些模块在Python中轻松创建一个自动点击器。本教程将展......
  • 启动mysql数据库时报错unknown variable 'rpl_semi_sync_slave_enabled=1'
    问题描述:启动mysql数据库时报错unknownvariable'rpl_semi_sync_slave_enabled=1'.数据库:mysql5.7.21系统:rhel7.31、异常重现--启动数据库[mysql@mysql-leo-slavedata]$/usr/local/mysql/bin/mysqld_safe--defaults-file=/home/mysql/etc/my.cnf&--告警信息2023-08-......