歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Hibernate持久化對象的三種狀態

Hibernate中持久化對象的狀態有:Transient、Persistent、Detached

持久化對象的生命周期是:

怎樣理解持久化對象的三種狀態呢?下面的代碼會體現出來

package com.bjpowernode.hibernate;

import java.util.Date;

import junit.framework.TestCase;

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

public class SessionTest extends TestCase {

 public void testSave1() {
  Session session = null;
  Transaction tx = null;
  try {
   session = HibernateUtils.getSession();
   tx = session.beginTransaction();
   
   //此時對象剛new出來,對象為Transient狀態,在數據庫中不存在
   User user = new User();
   user.setName("張三");
   user.setPassword("123");
   user.setCreateTime(new Date());
   user.setExpireTime(new Date());
   
   //Persistent狀態
   //Persistent狀態的對象,當對象的屬性發生改變的時候
   //hibernate在清理緩存(髒數據檢查)的時候,會和數據庫同步
   session.save(user);
   
   user.setName("李四");
   
   tx.commit();
   
  }catch(Exception e) {
   e.printStackTrace();
   if (tx != null) {
    tx.rollback();
   }
  }finally {
   HibernateUtils.closeSession(session);
  }
  //detached狀態
 }
 
 public void testSave2() {
  Session session = null;
  Transaction tx = null;
  try {
   session = HibernateUtils.getSession();
   tx = session.beginTransaction();
   
   //Transient狀態
   User user = new User();
   user.setName("張三");
   user.setPassword("123");
   user.setCreateTime(new Date());
   user.setExpireTime(new Date());
   
   //Persistent狀態
   //Persistent狀態的對象,當對象的屬性發生改變的時候
   //hibernate在清理緩存(髒數據檢查)的時候,會和數據庫同步
   session.save(user);
   
   user.setName("李四");
   
   //可以顯示的調用update方法,因為此時為持久狀態,調用update沒有什麼意義
   session.update(user);
   
   tx.commit();
   
  }catch(Exception e) {
   e.printStackTrace();
   if (tx != null) {
    tx.rollback();
   }
  }finally {
   HibernateUtils.closeSession(session);
  }
  //detached狀態
 } 
 
 public void testSave3() {
  Session session = null;
  Transaction tx = null;
  User user = null;
  try {
   session = HibernateUtils.getSession();
   tx = session.beginTransaction();
   
   //Transient狀態
   user = new User();
   user.setName("張三");
   user.setPassword("123");
   user.setCreateTime(new Date());
   user.setExpireTime(new Date());
   
   //Persistent狀態
   //Persistent狀態的對象,當對象的屬性發生改變的時候
   //hibernate在清理緩存(髒數據檢查)的時候,會和數據庫同步
   session.save(user);
   
   user.setName("李四");
   
   tx.commit();
   
  }catch(Exception e) {
   e.printStackTrace();
   if (tx != null) {
    tx.rollback();
   }
  }finally {
   HibernateUtils.closeSession(session);
  }
  //detached狀態,數據庫中存在,但不被session管理
  user.setName("王五");
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   //通過session.update()方法將detached狀態的對象重新納入session管理
   //此時將變為persistent狀態的對象
   //persistent狀態的對象,在清理緩存是會和數據庫同步
   session.update(user);
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 }

Session對象的幾種方法:

Get方法

特點:get加載上來的對象為持久對象;執行get會馬上發出查詢語句;get方法查詢數據庫中存在的數據;get方法查詢數據庫中不存在的數據,如果不存在返回null;get永遠不支持lazy

Load方法

特點:與get方法相同的是加載出來的數據也是持久化的;不會馬上發出查詢語句,因為load支持lazy(延遲加載/懶加載),什麼叫lazy?只有真正使用這個對象的時候,再創建,對於hibernate來說才真正的發出查詢語句,主要是為了提高性能,lazy是hibernate中非常重要的特性。hibernate的lazy是如何實現的?采用代理對象實現,代理對象主要采用的是CGLIB庫生成的,而不是JDK的動態代理,因為JDK的動態代理只能對實現了接口的類生成代理,CGLIB可以對類生成代理,它采用的是繼承方式;采用load查詢不存在的數據hibernate會拋出ObjectNotFoundException異常;load默認的是支持lazy

Update方法

特點:先加載再更新

Delete方法

特點:先加載再刪除

Copyright © Linux教程網 All Rights Reserved