hibernat之3.三種狀態

狀態圖:





三種狀態:

Transient(臨時狀態)

數據庫中不存在  session中不存在

Persistent(持久化狀態)

數據庫中存在   session中也存在

Detached(遊離狀態)

數據庫中存在   session中不存在


通過下面的一些例子,來看看三個狀態間的轉化,以及各自產生的sql語句的條數

臨時狀態

例一:

@Test
	public void transient01Test(){
		Student student=new Student();
		student.setStudentName("張三");
		student.setAge(20);
	}

只是單純的new一個對象,此時數據庫與session中並不存在該對象


持久化狀態

例二:

@Test
<span style="white-space:pre">	</span>public void persistent01Test(){
<span style="white-space:pre">		</span>Student student=new Student();
<span style="white-space:pre">		</span>student.setStudentName("張三");
<span style="white-space:pre">		</span>student.setAge(20);
<span style="white-space:pre">		</span>Session session=null;
<span style="white-space:pre">		</span>try {
<span style="white-space:pre">			</span>session=HibernateUtil.openSession();
<span style="white-space:pre">			</span>session.beginTransaction();
<span style="white-space:pre">			</span>session.save(student);
<span style="white-space:pre">			</span>session.getTransaction().commit();
<span style="white-space:pre">		</span>} catch (HibernateException e) {
<span style="white-space:pre">			</span>e.printStackTrace();
<span style="white-space:pre">			</span>session.getTransaction().commit();
<span style="white-space:pre">		</span>}finally{
<span style="white-space:pre">			</span>HibernateUtil.closeSession(session);
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}

student由臨時狀態轉爲持久化狀態,可以發現數據庫及session中它都存在,session存在的前提是session未關閉,

發送的sql語句:

Hibernate: insert into t_student (student_name, age, student_id) values (?, ?, ?)

例三:

@Test
	public void persistent02Test(){
		Student student=new Student();
		student.setStudentName("張三");
		student.setAge(20);
		Session session=null;
		try {
			session=HibernateUtil.openSession();
			session.beginTransaction();
			session.save(student);
			student.setStudentName("aa");
			session.getTransaction().commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			session.getTransaction().commit();
		}finally{
			HibernateUtil.closeSession(session);
		}
	}

由於調用save()方法後,student對象轉化爲持久化對象,在session中存在,當事務提交時,hibernate會將當前sudent對象與session中的sudent,進行比較

如果兩者不同,會將session中的student對象同步到數據庫中,發送update語句,兩者相同,不做處理.

發送sql語句:

Hibernate: insert into t_student (student_name, age, student_id) values (?, ?, ?)
Hibernate: update t_student set student_name=?, age=? where student_id=?


例四:

@Test
<span style="white-space:pre">	</span>public void persistent04Test(){
<span style="white-space:pre">		</span>Student student=new Student();
<span style="white-space:pre">		</span>student.setStudentName("張三");
<span style="white-space:pre">		</span>student.setAge(20);
<span style="white-space:pre">		</span>Session session=null;
<span style="white-space:pre">		</span>try {
<span style="white-space:pre">			</span>session=HibernateUtil.openSession();
<span style="white-space:pre">			</span>session.beginTransaction();
<span style="white-space:pre">			</span>session.save(student);
<span style="white-space:pre">			</span>student.setStudentName("aa");
<span style="white-space:pre">			</span>session.update(student);
<span style="white-space:pre">			</span>student.setAge(55);
<span style="white-space:pre">			</span>session.update(student);
<span style="white-space:pre">			</span>session.save(student);
<span style="white-space:pre">			</span>session.save(student);
<span style="white-space:pre">			</span>session.getTransaction().commit();
<span style="white-space:pre">		</span>} catch (HibernateException e) {
<span style="white-space:pre">			</span>e.printStackTrace();
<span style="white-space:pre">			</span>session.getTransaction().commit();
<span style="white-space:pre">		</span>}finally{
<span style="white-space:pre">			</span>HibernateUtil.closeSession(session);
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}

若一個持久化對象若發現變化後,調用多次update()或save()也是無效的,,只有事務提交時,纔會同步到數據庫,發送update語句

發送sql語句:

Hibernate: insert into t_student (student_name, age, student_id) values (?, ?, ?)
Hibernate: update t_student set student_name=?, age=? where student_id=?

遊離狀態:

例五:

@Test
	public void detach01Test(){
		Student student=new Student();
		student.setStudentId(2);
		student.setStudentName("2b");
		student.setAge(22);
		Session session=null;
		try {
			session=HibernateUtil.openSession();
			session.beginTransaction();
			session.update(student);
			session.getTransaction().commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			session.getTransaction().commit();
		}finally{
			HibernateUtil.closeSession(session);
		}
	}

此時id爲2的studnet對象爲遊離狀態(數據庫中存在,session不存在),通過調用update()方法轉化爲持久化狀態

發送sql語句:

Hibernate: update t_student set student_name=?, age=? where student_id=?

例六:

@Test
	public void detach02Test(){
		Student student=new Student();
		student.setStudentId(2);
		Session session=null;
		try {
			session=HibernateUtil.openSession();
			session.beginTransaction();
			session.delete(student);
			session.getTransaction().commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			session.getTransaction().commit();
		}finally{
			HibernateUtil.closeSession(session);
		}
	}


此時id爲2的studnet對象爲遊離狀態(數據庫中存在,session不存在),通過調用delete()方法轉化爲臨時狀態(數據中不存在,session中也不存在)


    發送sql語句:

Hibernate: delete from t_student where student_id=?




    例七:


@Test
	public void detach03Test(){
		Session session=null;
		try {
			session=HibernateUtil.openSession();
			session.beginTransaction();
			Student student=(Student)session.get(Student.class,3);
			student.setStudentName("ddddd");
			session.getTransaction().commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			session.getTransaction().commit();
		}finally{
			HibernateUtil.closeSession(session);
		}
	}

調用get()方法,student由遊離狀態變爲持久化狀態,當事務提交時會比較當前對象


發送sql語句:

Hibernate: select student0_.student_id as student1_0_0_, student0_.student_name as student2_0_0_, student0_.age as age0_0_ from t_student student0_ where student0_.student_id=?
Hibernate: update t_student set student_name=?, age=? where student_id=?


發佈了142 篇原創文章 · 獲贊 11 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章