1. 程式人生 > >Hibernate 的三種狀態

Hibernate 的三種狀態

out clear sql bsp imp 語句 lose tac system

1.Transient 狀態

  There is no records in database.

2.Persistent狀態

Data exists in database, and data has been managed by Hibernate session

3.Detached狀態

Data exists in database, but data did not get managed by Hibernate session

package org.test.test;

import java.text.SimpleDateFormat;

import
org.hibernate.Session; import org.junit.Test; import org.test.itat.model.User; import org.test.util.HibernateUtil; public class TestStatus { private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); @Test public void testTransient() { Session session = null
; try { session = HibernateUtil.openSession(); session.beginTransaction(); User u = new User(); u.setBorn(sdf.parse("1976-2-3")); u.setUsername("zxl"); u.setNickname("趙曉六"); u.setPassword("123");
//以上u就是Transient(瞬時狀態),表示沒有被session管理並且數據庫中沒有 //執行save之後,被session所管理,而且,數據庫中已經存在,此時就是Persistent狀態 session.save(u); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } @Test public void testPersistent01() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); User u = new User(); u.setBorn(sdf.parse("1976-2-3")); u.setUsername("zxq"); u.setNickname("趙曉七"); u.setPassword("123"); //以上u就是Transient(瞬時狀態),表示沒有被session管理並且數據庫中沒有 //執行save之後,被session所管理,而且,數據庫中已經存在,此時就是Persistent狀態 session.save(u); //此時u是持久化狀態,已經被session所管理,當在提交時,會把session中的對象和目前的對象進行比較 //如果兩個對象中的值不一致就會繼續發出相應的sql語句 u.setNickname("趙曉其"); //此時會發出2條sql,一條用戶做插入,一條用來做更新 session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } @Test public void testPersistent02() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); User u = new User(); u.setBorn(sdf.parse("1976-2-3")); u.setUsername("zxq"); u.setNickname("趙曉八"); u.setPassword("123"); session.save(u); u.setPassword("222"); //下條條語句沒有意義 session.save(u); u.setNickname("趙曉吧"); //下條語句沒有意義 session.update(u); u.setBorn(sdf.parse("1988-12-22")); //下條語句沒有意義 session.update(u); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } @Test public void testPersistent03() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); User u = new User(); u.setBorn(sdf.parse("1976-2-3")); u.setUsername("zxq"); u.setNickname("趙曉九"); u.setPassword("123"); session.save(u); /* * 以下三條語句沒有任何意義,如果沒有任何變化,不會發出sql語句 */ session.save(u); session.update(u); session.update(u); u.setUsername("zxj"); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } @Test public void testPersistent04() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); //此時u是Persistent User u = (User)session.load(User.class, 10); //由於u這個對象和session中的對象不一致,所以會發出sql完成更新 u.setUsername("aaa"); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } @Test public void testPersistent05() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); //此時u是Persistent User u = (User)session.load(User.class, 10); session.getTransaction().commit(); session.beginTransaction(); u.setUsername("123"); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } @Test public void testPersistent06() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); //此時u是Persistent User u = (User)session.load(User.class, 11); u.setUsername("123"); //清空session session.clear(); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } @Test public void testDetach01() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); User u = new User(); u.setId(10); u.setNickname("abc"); //當執行save的時候總是會添加一條數據,此時id就會根據Hibernate所定義的規則來生成 session.save(u); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } @Test public void testDetach02() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); User u = new User(); u.setId(10); //完成update之後也會變成持久化狀態 session.update(u); u.setBorn(sdf.parse("1998-12-22")); u.setNickname("aaa"); u.setUsername("111"); //會發出一條sql session.update(u); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } @Test public void testDetach03() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); User u = new User(); u.setId(10); //完成update之後也會變成持久化狀態 session.update(u); u.setBorn(sdf.parse("1998-12-22")); u.setNickname("aaa"); u.setUsername("111"); //會拋出異常 u.setId(333); //會發出一條sql session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } @Test public void testDetach04() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); User u = new User(); u.setId(10); //現在u就是transient對象 session.delete(u); //此時u已經是瞬時對象,不會被session和數據庫所管理 u.setNickname("abc"); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } @Test public void testDetach05() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); User u = new User(); // u.setId(110); u.setNickname("abc"); //如果u是離線狀態就執行update操作,如果是瞬時狀態就執行Save操作 //但是註意:該方法並不常用 session.saveOrUpdate(u); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } @Test public void testDetach06() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); //u1已經是持久化狀態 User u1 = (User)session.load(User.class, 11); System.out.println(u1.getNickname()); //u2是離線狀態 User u2 = new User(); u2.setId(11); u2.setPassword("12223"); //此時u2將會變成持久化狀態,在session的緩存中就存在了兩份同樣的對象,在session中不能存在兩份拷貝,否則會拋出異常 // session.saveOrUpdate(u2); //merge方法會判斷session中是否已經存在同一個對象,如果存在就將兩個對象合並 session.merge(u2); //最佳實踐:merge一般不用 session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } }

Hibernate 的三種狀態