国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

java框架篇---hibernate之session狀態

2019-11-14 23:50:29
字體:
來源:轉載
供稿:網友
java框架篇---hibernate之session狀態

Session接口是Hibernate向程序提供操縱數據庫的最主要接口,是單線程對象,它提供了基本的保存、更新、刪除和查詢方法。它有一個緩存,保存了持久化對象,當清理緩存時,按照這些持久化對象同步更新數據庫。

注意:session的某些方法(persist,load)不會立即把改動寫入數據庫,而是緩存到session的一級緩存中,除非顯示調用flush,或者關閉session時才會更新到數據庫

  1. 臨時狀態(Transient):沒與session關聯
  2. 持久化狀態(Persistent):與session關聯,沒close
  3. 游離狀態(Detached):當session.close后
Session的方法詳解

1.保存

save:立即插入數據庫,并且返回主鍵

persist:不立即(延遲)插入數據庫,無返回值

2.獲取

load:加載對象后,對對象的改動不會立即刷新到db,必須flush到db

ex: User user=session.load(User.class,2);

user.setName('gt');

user.flush(); (延遲加載)

get:加載對象后,對對象的改動立即刷新到db

3.更新

update:持久化對象,更新

saveOrUpdate:包含save()和update()功能,如果傳入的參數是臨時對象(沒有保存過)就調用save()方法;如果傳入的參數是游離對象,就調用update()方法

merge:不會持久化對象,只會把托管對象的修改更新到db

4.刪除

delete:從數據庫中刪除與JAVA對象對應的記錄

5.清理

flush:把緩存同步到db

clear:清除session的緩存大小(更新批量時,應考慮)

三種狀態的轉換關系

下面通過實例講解:

實體:

package cn.itcast.h_session_method;public class User {    PRivate Integer id;    private String name;    private byte[] data = new byte[1024 * 1024 * 5];    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

映射文件:

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="cn.itcast.h_session_method">        <!--         lazy屬性:默認為true,默認可以懶加載。     -->    <class name="User" table="user" lazy="true">        <id name="id">            <generator class="native"></generator>        </id>        <property name="name"/>    </class>    </hibernate-mapping>

配置文件:hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory>    <!--數據庫連接設置 -->    <property name="connection.driver_class">        com.MySQL.jdbc.Driver    </property>    <property name="connection.url">        jdbc:mysql://localhost:3306/mytest    </property>    <property name="connection.username">root</property>    <property name="connection.passWord">root</property>    <!-- 方言 -->    <property name="dialect">        org.hibernate.dialect.MySQL5Dialect    </property>    <!-- 控制臺顯示SQL -->    <property name="show_sql">true</property>    <!-- 自動更新表結構 -->    <property name="hbm2ddl.auto">update</property>    <mapping resource="cn/itcast/h_session_method/User.hbm.xml" /></session-factory></hibernate-configuration>

測試文件

package cn.itcast.h_session_method;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.junit.Test;import com.java1234.util.HibernateSessionFactory;public class App {    private static SessionFactory sessionFactory = HibernateSessionFactory.getSessionFactory();    // save():把臨時狀態變為持久化狀態(交給Sessioin管理)    // 會生成:insert into ...    @Test    public void testSave() throws Exception {        Session session = sessionFactory.openSession();        session.beginTransaction();        // --------------------------------------------        User user = new User(); // 臨時狀態        user.setName("test");        session.save(user); // 變為了持久化狀態        // --------------------------------------------        session.getTransaction().commit();        session.close();        user.setName("李四"); // 游離狀態        System.out.println(user.getName()); // 游離狀態    }    // update():把游離狀態變為持久化狀態    // 會生成:update ...    // 在更新時,對象不存在就報錯    @Test    public void testUpdate() throws Exception {        Session session = sessionFactory.openSession();        session.beginTransaction();        // --------------------------------------------        User user = (User) session.get(User.class, 1);        System.out.println(user.getName()); // 持久化狀態        // session.clear(); // 清除Session中所有的對象        session.evict(user); // 清除Session中一個指定的對象        user.setName("newname3");        session.update(user);        System.out.println("----");        // session.flush(); // 刷出到數據庫        // --------------------------------------------        session.getTransaction().commit(); //         session.close();    }    // saveOrUpdate():把臨時或游離狀態轉為持久化狀態    // 會生成:insert into 或 update ...    // 在更新時,對象不存在就報錯    // 本方法是根據id判斷對象是什么狀態的:如果id為原始值(對象的是null,原始類型數字是0)就是臨時狀態,如果不是原始值就是游離狀態。    @Test    public void testSaveOrUpdate() throws Exception {        Session session = sessionFactory.openSession();        session.beginTransaction();        // --------------------------------------------        User user = new User();        user.setId(3); // 自己生成一個游離狀態對象        user.setName("newName");        session.saveOrUpdate(user);        // --------------------------------------------        session.getTransaction().commit();        session.close();    }    // delete():把持久化或游離轉為刪除狀態    // 會生成:delete ...    // 如果刪除的對象不存在,就會拋異常    @Test    public void testDelete() throws Exception {        Session session = sessionFactory.openSession();        session.beginTransaction();        // --------------------------------------------        // User user = (User) session.get(User.class, 2); // 持久化        User user = new User();        user.setId(300);        session.delete(user);        session.flush();        System.out.println("---");        // --------------------------------------------        session.getTransaction().commit();        session.close();    }    // get():獲取數據,是持久化狀態    // 會生成:select ... where id=?    // 會馬上執行sql語句    // 如果數據不存在,就返回null    @Test    public void testGet() throws Exception {        Session session = sessionFactory.openSession();        session.beginTransaction();        // --------------------------------------------        User user = (User) session.get(User.class, 5); // 持久化        System.out.println(user.getClass());        // System.out.println("---");        // System.out.println(user.getName());        // --------------------------------------------        session.getTransaction().commit();        session.close();    }    // load():獲取數據,是持久化狀態    // 會生成:select ... where id=?    // load()后返回的是一個代理對象,要求類不能是final的,否則不能生成子類代理,就不能使用懶加載功能了。    // 讓懶加載失效的方式:一、把實體寫成final的;二、在hbm.xml中寫<class ... lazy="false">    // 不會馬上執行sql語句,而是在第1次使用非id或class屬性時執行sql。    // 如果數據不存在,就拋異常:ObjectNotFoundException    @Test    public void testLoad() throws Exception {        Session session = sessionFactory.openSession();        session.beginTransaction();        // --------------------------------------------        User user = (User) session.load(User.class, 5);        System.out.println(user.getClass());        System.out.println("---");        System.out.println(user.getId());        System.out.println(user.getName());        // System.out.println(user.getName());        // --------------------------------------------        session.getTransaction().commit();        session.close();    }    // 操作大量數據,要防止Session中對象過多而內存溢出    @Test    public void testBatchSave() throws Exception {        Session session = sessionFactory.openSession();        session.beginTransaction();        // --------------------------------------------        for (int i = 0; i < 30; i++) {            User user = new User();            user.setName("測試");            session.save(user);            if (i % 10 == 0) {                session.flush(); // 先刷出                session.clear(); // 再清空            }        }        // --------------------------------------------        session.getTransaction().commit();        session.close();    }    @Test    public void test2() throws Exception {        Session session = sessionFactory.openSession();        session.beginTransaction();        // --------------------------------------------        User user = (User) session.get(User.class, 5); // 持久化        System.out.println(user.getName());        // session.clear();        // user = (User) session.get(User.class, 5); // 持久化        session.refresh(user); // 刷新Session緩存中對象的狀態,即重新select一下        System.out.println(user.getName());        // --------------------------------------------        session.getTransaction().commit();        session.close();    }}

對于剛創建的一個對象,如果session中和數據庫中都不存在該對象,那么該對象就是臨時對象(Transient)

臨時對象調用save方法,或者游離對象調用update方法可以使該對象變成持久化對象,如果對象是持久化對象時,那么對該對象的任何修改,都會在提交事務時才會與之進行比較,如果不同,則發送一條update語句,否則就不會發送語句

游離對象就是,數據庫存在該對象,但是該對象又沒有被session所托管


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 绍兴市| 嘉黎县| 青岛市| 常州市| 峨眉山市| 文安县| 安乡县| 新源县| 庆元县| 唐海县| 平顺县| 惠安县| 潮州市| 拜泉县| 房产| 永川市| 郑州市| 兴城市| 贺兰县| 蓬安县| 南皮县| 淄博市| 丹江口市| 油尖旺区| 岳池县| 蒙阴县| 峡江县| 随州市| 雷州市| 石门县| 当涂县| 准格尔旗| 巴彦县| 临颍县| 汤原县| 德州市| 信丰县| 宁波市| 古丈县| 龙州县| 大姚县|