1. 程式人生 > >Hibernate學習筆記2.4(Hibernate核心開發接口和三種狀態)

Hibernate學習筆記2.4(Hibernate核心開發接口和三種狀態)

thread rsa 分享 action let 能力 ima 方法 如果

1.configuration(配置信息管理,產生sessionfactory)

技術分享圖片

sessionfactory管理一系列的連接池

opensession 永遠打開新的,需要手動close

getcurrentsession如果當前環境有,就會用已經存在的,沒有就創建新的

一旦提交就沒了

getcurrentsession主要用於界定事務邊界,事務提交自動close

上下文:在hibernate.cfg.xml裏面改 currentsession_context_class

thread:線程 當前線程有沒有一個對象,沒有就創建i新的,使用connection

jta: 分布式事務 ,Java tarsaction api多數由中間鍵服務器提供 Tomcat不具備該能力

manager:手動管理事務

custormclass:自己定義

如果使用getcurrentsession必須設定上下文環境

geucurrentsession和sessionopen拿到的類 具體實現可能不一樣 因此一般情況下 不建議混用

如果址用hibernate 就要寫trycatch

用spring的話就不用寫try catch

save();設定一個主鍵,id

首先搞懂三種狀態

技術分享圖片

三種狀態

transient :內存中的一個對象 緩存中沒有對應的id和value

Persistent:內存中有 緩存中有 數據庫有 有id

Datached: 內存有 緩存沒有 數據庫有 有id

save方法即是把transient轉化為Persisitence

delete方法

Load

    @Test
    public void testLoad() {
    
        Session session = sessionFactory.getCurrentSession();
        session.beginTransaction();
        Teacher t = (Teacher)session.load(Teacher.class, 1);
        
        session.getTransaction().commit();
        System.
out.println(t.getClass()); //System.out.println(t.getName()); }

1,自動打包為intege 實現了序列化接口

get

@Test
    public void testGet() {
    
        Session session = sessionFactory.getCurrentSession();
        session.beginTransaction();
        Teacher t = (Teacher)session.get(Teacher.class, 1);
        
        session.getTransaction().commit();
        System.out.println(t.getClass());
        //System.out.println(t.getName());
    }
    

用load拿出東西的時候才會發出sql語句,不存在對應記錄不拿東西不會報錯,返回代理對象()

用get拿出對象的時候是直接在數據庫加載,不存在對應記錄不拿東西也會報錯

update

第一種 有detach到persistence 同時數據庫更新

    @Test
    public void testUpdate1() {
    
        Session session = sessionFactory.getCurrentSession();
        session.beginTransaction();
        Teacher t = (Teacher)session.get(Teacher.class, 1);
        
        session.getTransaction().commit();
        
        t.setName("zhanglaoshi");
        
        Session session2 = sessionFactory.getCurrentSession();
        session2.beginTransaction();
        session2.update(t);
        
        session2.getTransaction().commit();
    }

更新trasent會報錯

如果transent設置id數據庫並且存在

數據庫得有對應的記錄

@Test
    public void testUpdate2() {
        
        
        Teacher t = new Teacher();
        t.setName("zhanglaoshi");
        
        Session session2 = sessionFactory.getCurrentSession();
        session2.beginTransaction();
        session2.update(t);
        
        session2.getTransaction().commit();
    }
    

如果有一個字段特別長 全改就會變低

技術分享圖片

32集第九分鐘

Hibernate學習筆記2.4(Hibernate核心開發接口和三種狀態)