亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Hibernate之CRUD與實(shí)例狀態(tài)

Youngdze / 1130人閱讀

摘要:本文將繼續(xù)介紹簡(jiǎn)單的增刪改查方法和對(duì)對(duì)象實(shí)例狀態(tài)的理解查詢方法暫不提及。二實(shí)例狀態(tài)中的對(duì)象有中狀態(tài)瞬時(shí)對(duì)象持久化對(duì)象和離線對(duì)象也叫做脫管對(duì)象。持久化狀態(tài)已經(jīng)被持久化,并且加入到緩存中。處于游離狀態(tài)的對(duì)象稱為游離對(duì)象。

在上一篇《初識(shí)Hibernate》中簡(jiǎn)單介紹了在Hibernate如何加載對(duì)象和持久化對(duì)象,以及Hibernate中對(duì)象實(shí)例狀態(tài)。本文將繼續(xù)介紹Hibernate簡(jiǎn)單的增刪改查方法和對(duì)對(duì)象實(shí)例狀態(tài)的理解(查詢方法暫不提及)。
一、HibernateのCRUD操作 1.1 HibernateのCreate
    @Test
    public void testCreate() {
        Session session = HibernateUtils.getSession();
        User user = new User();
        user.setId(3);
        user.setUserName("Sandy");
        user.setPassWord("aaa");
        session.save(user);
    }

注意:Hibernate事務(wù)默認(rèn)是關(guān)閉的,執(zhí)行后不會(huì)報(bào)錯(cuò),但是數(shù)據(jù)并沒(méi)有成功插入數(shù)據(jù)庫(kù)。

控制臺(tái)輸出:Schema update complete

解決辦法:手動(dòng)設(shè)置事務(wù)提交

    @Test
    public void testCreate() {
        Session session = HibernateUtils.getSession();
        Transaction tx = session.beginTransaction();
        User user = new User();
        user.setId(3);
        user.setUserName("Sandy");
        user.setPassWord("aaa");
        session.save(user);
        tx.commit();
    }

控制臺(tái)輸出:Hibernate: insert into tbl_user (username, password, id) values (?, ?, ?)

save()方法把一個(gè)臨時(shí)對(duì)象加入到Session緩存中,并持久化該臨時(shí)對(duì)象,計(jì)劃執(zhí)行一個(gè)insert語(yǔ)句。
1.2 HibernateのRead

這里的查詢準(zhǔn)確來(lái)說(shuō)應(yīng)該稱為對(duì)象加載

Hibernate中session.get()方式獲取被稱為對(duì)象加載,只能從數(shù)據(jù)庫(kù)中加載出唯一一條記錄。查詢多條數(shù)據(jù)Hibernate另提供了API。
    @Test
    public void testRead() {
        Session session = HibernateUtils.getSession();
        Transaction tx = session.beginTransaction();
        User user = (User)session.get(User.class, 3);
        System.out.println(user);
        tx.commit();
    }

控制臺(tái)輸出:Hibernate: select user0_.id as id1_8_0_, user0_.username as username2_8_0_, user0_.password as password3_8_0_ from tbl_user user0_ where user0_.id=?
User{id=3, userName="Sandy", passWord="aaa"}

get()load()  試圖從數(shù)據(jù)庫(kù)加載一個(gè)實(shí)體對(duì)象時(shí),Session先判斷對(duì)象是否存在,如果存在就不到數(shù)據(jù)庫(kù)中檢索。返回的對(duì)象都位于Session緩存中,接下來(lái)修改了持久化對(duì)象的屬性后,當(dāng)Session清理緩存時(shí),會(huì)根據(jù)持久化對(duì)象的屬性變化來(lái)同步更新數(shù)據(jù)庫(kù)。

? 區(qū)別:

? (1)當(dāng)數(shù)據(jù)庫(kù)中不存在與OID對(duì)應(yīng)的記錄時(shí),load()方法拋出ObjectNotFoundException異常,而get()方法返回null.

? (2)兩者采用不同的檢索策略。

? 默認(rèn)情況下,load()方法采用延遲檢索策略(Hibernate不會(huì)執(zhí)行select語(yǔ)句,僅返回實(shí)體類的代理類實(shí)例,占用內(nèi)存很少);而get()采用立即檢索策略(Hibernate會(huì)立即執(zhí)行select語(yǔ)句)。

? 使用場(chǎng)合:

? (1)如果加載一個(gè)對(duì)象的目的是為了訪問(wèn)它的各個(gè)屬性,可以用get();

? (2)如果加載一個(gè)對(duì)象的目的是為了刪除它,或者建立與別的對(duì)象的關(guān)聯(lián)關(guān)系,可以用load() ;

1.3 HibernateのUpdate
更新操作并沒(méi)有使用session.update()方法,直接tx.commit()便能夠成功更新數(shù)據(jù)。session.upate()方法另有作用。
    @Test
    public void testUpdate() {
        Session session = HibernateUtils.getSession();
        Transaction tx = session.beginTransaction();
        User user = (User)session.get(User.class, 3);
        user.setUserName("Bob");
        user.setPassWord("123");
        // 臟數(shù)據(jù)(Dirty Data)
        // 過(guò)時(shí)數(shù)據(jù)檢測(cè)(前提是該對(duì)象是持久態(tài))
        tx.commit();
    }

控制臺(tái)輸出:Hibernate: select user0_.id as id1_8_0_, user0_.username as username2_8_0_, user0_.password as password3_8_0_ from tbl_user user0_ where user0_.id=?
Hibernate: update tbl_user set username=?, password=? where id=?

Session在清理緩存的時(shí)候會(huì)自動(dòng)進(jìn)行臟檢查(dirty-check),如果發(fā)現(xiàn)Session緩存中的對(duì)象與數(shù)據(jù)庫(kù)中相應(yīng)的記錄不一致,就會(huì)同步數(shù)據(jù)庫(kù)。
1.4 HibernateのDelete
    @Test
    public void testDelete() {
        Session session = HibernateUtils.getSession();
        Transaction tx = session.beginTransaction();
        User user = (User)session.get(User.class, 3);
        user.setUserName("Bob");
        user.setPassWord("123");
        session.delete(user);
        tx.commit();
    }

控制臺(tái)輸出:Hibernate: select user0_.id as id1_8_0_, user0_.username as username2_8_0_, user0_.password as password3_8_0_ from tbl_user user0_ where user0_.id=?
Hibernate: delete from tbl_user where id=?

計(jì)劃執(zhí)行一個(gè)delete語(yǔ)句,把對(duì)象從Session緩存中刪除。
1.5 saveOrUpdate
同時(shí)包含了save()和update()方法的功能。如果傳入的是臨時(shí)對(duì)象,就調(diào)用save()方法;如果傳入的是游離對(duì)象,就調(diào)用update()方法如果傳入的是持久化對(duì)象,就直接返回。
    @Test
    public void testSaveOrUpdate() {
        Session session = HibernateUtils.getSession();
        Transaction tx = session.beginTransaction();
        User user = new User();
        user.setId(5);
        user.setUserName("Sandy");
        user.setPassWord("123");
        session.saveOrUpdate(user);

        User user2 = (User)session.get(User.class, 1);
        user2.setUserName("Andy");
        user2.setPassWord("apple");
        session.saveOrUpdate(user2);
        tx.commit();
        session.close();
    }

控制臺(tái)輸出:Hibernate: select user_.id, user_.username as username2_8_, user_.password as password3_8_ from tbl_user user_ where user_.id=?
Hibernate: select user0_.id as id1_8_0_, user0_.username as username2_8_0_, user0_.password as password3_8_0_ from tbl_user user0_ where user0_.id=?
Hibernate: insert into tbl_user (username, password, id) values (?, ?, ?)
Hibernate: update tbl_user set username=?, password=? where id=?

update()方法把游離對(duì)象加入當(dāng)前Session緩存中,計(jì)劃執(zhí)行update語(yǔ)句。當(dāng)update()方法關(guān)聯(lián)一個(gè)游離對(duì)象時(shí),如果session緩存中已經(jīng)有一個(gè)同類型且ID相同的持久化對(duì)象,那么update()方法會(huì)拋出NonUniqueException異常。當(dāng)update()方法關(guān)聯(lián)一個(gè)持久化對(duì)象時(shí),該方法不起作用。

close():清空session緩存。

二、Hibernateの實(shí)例狀態(tài)
Hibernate中的對(duì)象有3中狀態(tài),瞬時(shí)對(duì)象(TransientObjects)、持久化對(duì)象(PersistentObjects)和離線對(duì)象(DetachedObjects也叫做脫管對(duì)象)。

Java對(duì)象在Hibernate持久化層的狀態(tài):

瞬時(shí)(transient)狀態(tài):剛用new語(yǔ)句創(chuàng)建,還沒(méi)有被持久化,并且不處于session緩存中(處于臨時(shí)狀態(tài)的對(duì)象成為臨時(shí)對(duì)象)。

持久化(Persistent)狀態(tài):已經(jīng)被持久化,并且加入到session緩存中。處于持久化狀態(tài)的對(duì)象稱為持久化對(duì)象。

游離(Detached)狀態(tài):已經(jīng)被持久化,但不再處于session緩存中。處于游離狀態(tài)的對(duì)象稱為游離對(duì)象。

刪除狀態(tài):不再處于session緩存中,并且session已經(jīng)計(jì)劃將其從數(shù)據(jù)庫(kù)中刪除。

    @Test
    public void testState() {
        Session session = HibernateUtils.getSession();
        Transaction tx = session.beginTransaction();
        // 持久態(tài)對(duì)象
        // 1.在數(shù)據(jù)庫(kù)中有唯一一條記錄關(guān)聯(lián) 2.必須跟一個(gè)session關(guān)聯(lián)(必須納入Hibernate容器)
        User user = (User)session.get(User.class, 1);

        // 臨時(shí)態(tài)
        // User user = new User();

        user.setUserName("Fancy");
        user.setPassWord("abc");

        // 臟數(shù)據(jù)(Dirty Data)過(guò)時(shí)數(shù)據(jù)檢測(cè)(前提是該對(duì)象是持久態(tài))
        tx.commit();
        // 關(guān)閉session
        session.close();

        // 游離態(tài)(Detached)
        // 1.在數(shù)據(jù)庫(kù)中有唯一一條記錄對(duì)應(yīng) 2.當(dāng)前user沒(méi)有跟Hibernate的session關(guān)聯(lián)(曾經(jīng)跟Hibernate關(guān)聯(lián),現(xiàn)在沒(méi)有)
        // 無(wú)法進(jìn)行臟數(shù)據(jù)檢測(cè)
        System.out.println(user);

        //把游離態(tài)對(duì)象變?yōu)槌志脩B(tài)(再次納入Hibernate容器管理,再跟一個(gè)session關(guān)聯(lián)起來(lái))
        Session session2 =HibernateUtils.getSession();
        Transaction tx2 = session2.beginTransaction();
        user.setUserName("Kathy");
        user.setPassWord("good");

        //把游離態(tài)對(duì)象同一個(gè)session關(guān)聯(lián),將對(duì)象狀態(tài)變?yōu)槌志脩B(tài)
        session2.update(user);
        tx2.commit();
    }
}

控制臺(tái)輸出:Hibernate: select user0_.id as id1_8_0_, user0_.username as username2_8_0_, user0_.password as password3_8_0_ from tbl_user user0_ where user0_.id=?
User{id=1, userName="Fancy", passWord="abc"}
Hibernate: update tbl_user set username=?, password=? where id=?

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/73488.html

相關(guān)文章

  • 使用Java編程引導(dǎo)JPA

    摘要:從好的方面來(lái)說(shuō),只需使用普通的就可以在不使用文件的情況下引導(dǎo)實(shí)現(xiàn)。請(qǐng)注意,為簡(jiǎn)潔起見(jiàn),我們省略了類案例結(jié)論在本文中,我們展示了如何使用的接口和的類的自定義實(shí)現(xiàn)以編程方式引導(dǎo)實(shí)體管理器,而不必依賴傳統(tǒng)的文件。 案例概述 大多數(shù)JPA驅(qū)動(dòng)的應(yīng)用程序大量使用persistence.xml文件來(lái)獲取JPA實(shí)現(xiàn),例如Hibernate或OpenJPA。 我們的方法提供了一種集中式機(jī)制,用于配置一...

    ymyang 評(píng)論0 收藏0
  • Hibernate問(wèn)題集錦

    摘要:查詢照樣寫(xiě)就行,如下參考問(wèn)題七中關(guān)于多表連接查詢和返回值集合中對(duì)象問(wèn)題錯(cuò)誤的查詢語(yǔ)句釋放分析原來(lái)是查詢出來(lái)的字段并不能自動(dòng)轉(zhuǎn)換為對(duì)象。參考問(wèn)題八原因原生的語(yǔ)句中返回值為,而語(yǔ)句中的返回值位型的,網(wǎng)上說(shuō)的主要是兼容而做的。 首先奉上Hibernate3.2 API地址:http://docs.jboss.org/hiberna...Hibernate4.3 API地址:http://do...

    niceforbear 評(píng)論0 收藏0
  • 一起來(lái)學(xué)SpringBoot | 第六篇:整合SpringDataJpa

    摘要:忽略該字段的映射省略創(chuàng)建數(shù)據(jù)訪問(wèn)層接口,需要繼承,第一個(gè)泛型參數(shù)是實(shí)體對(duì)象的名稱,第二個(gè)是主鍵類型。 SpringBoot 是為了簡(jiǎn)化 Spring 應(yīng)用的創(chuàng)建、運(yùn)行、調(diào)試、部署等一系列問(wèn)題而誕生的產(chǎn)物,自動(dòng)裝配的特性讓我們可以更好的關(guān)注業(yè)務(wù)本身而不是外部的XML配置,我們只需遵循規(guī)范,引入相關(guān)的依賴就可以輕易的搭建出一個(gè) WEB 工程 上一篇介紹了Spring JdbcTempl...

    Dionysus_go 評(píng)論0 收藏0
  • Java學(xué)習(xí)路線總結(jié),搬磚工逆襲Java架構(gòu)師(全網(wǎng)最強(qiáng))

    摘要:哪吒社區(qū)技能樹(shù)打卡打卡貼函數(shù)式接口簡(jiǎn)介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁(yè)左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無(wú)意間聽(tīng)到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡(jiǎn)而言之,不缺干 ? 哪吒社區(qū)Java技能樹(shù)打卡?【打卡貼 day2...

    Scorpion 評(píng)論0 收藏0
  • 【從零入門(mén)系列-2】Spring Boot 數(shù)據(jù)庫(kù)實(shí)體定義實(shí)現(xiàn)

    摘要:文章系列從零入門(mén)系列之從零入門(mén)系列之程序結(jié)構(gòu)設(shè)計(jì)說(shuō)明前言本篇文章開(kāi)始代碼實(shí)踐,系統(tǒng)設(shè)計(jì)從底向上展開(kāi),因此本篇先介紹如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)表實(shí)體類的設(shè)計(jì)實(shí)現(xiàn)。主鍵由數(shù)據(jù)庫(kù)自動(dòng)生成主要是自動(dòng)增長(zhǎng)型主鍵由程序控制。 文章系列 【從零入門(mén)系列-0】Sprint Boot 之 Hello World 【從零入門(mén)系列-1】Sprint Boot 之 程序結(jié)構(gòu)設(shè)計(jì)說(shuō)明 前言 本篇文章開(kāi)始代碼實(shí)踐,系統(tǒng)...

    nemo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<