1. 程式人生 > >小白的進階之路11

小白的進階之路11

com 什麽 樂觀鎖 div 還要 路徑 xml文件 lis hiberna

想著做個項目,奈何前端是我的弱項,只會寫一下div+css,好不容易寫好了,發現css引不進入,老是報錯,說什麽路徑不對,一氣之下,我就css樣式改成了內聯式。

技術分享圖片

忙活了一上午,想實現保存客戶的功能,可就是有一點出bug了,servlet老是跳不過去,一直在報404的錯誤,

只好放棄,回頭再想,現在繼續往下學。

hibernate的第二天。

引入一個概念:持久類:就是javabean+XXX.hbm.xml

就是註意在生成javabean的類時,要配置xml文件,以及核心的xml文件。

最後就是主鍵的問題,

技術分享圖片

UUID,則自動生成主鍵,此主鍵是字符串類型,而且較長。

技術分享圖片

native則是自動遞增。屬於int型。

一般推薦這兩種。

對象的三個狀態:瞬時態--》持久態--》脫管態

技術分享圖片

這就是瞬時態,無主鍵ID,無session。(黑戶)

技術分享圖片

這是持久態,有主鍵,有session。

技術分享圖片

這是脫管態,有id,無session。(喪偶)

技術分享圖片

持久態對象有自動更新數據庫的能力。

技術分享圖片

為什麽會這樣?

為什麽持久態對象由自動更新數據庫的能力?

因為session的一級緩存。

那麽。問題來了,什麽是緩存?

緩存就是在內存中開辟一片空間,將數據放在其中,再次獲取的時候可以直接拿,就提高了程序的性能。

hibernate支持二級緩存,一級緩存是session,session的底層是集合鏈表 list。二級緩存是sessionfactory。

但是二級緩存需要手動連接,多個session可以共享數據。

session的以及緩存可以證明。

技術分享圖片

另外一種證明方式,就是兩次查詢同一個對象,然而顯示一條SQL語句。

技術分享圖片

那麽?為什麽還要有session.update();呢?

事務是一組操作,要麽同時成功。要麽同時失敗。

事務的特性:原子性:事務不可分割

      一致性:操作前後保持數據完整。

      隔離性:事物之間相互隔離,不可幹擾。

      持久性:事務一旦提交,數據永久保持。

如果不考慮隔離性,則會引發一些讀的問題:①臟讀:一個事務讀到了另一個事務沒提交的數據

②不可重復讀:一個事務讀到了另一個事務已經提交的update數據,導致查詢結果不一致。

③:虛讀:一個事務讀到了另一個事務已經提交的insert數據,導致查詢結果不一致。

如何解決這些問題?

通過設置數據庫的隔離級別。

未提交讀:什麽都可能發生

已提交讀:避免了臟讀,但是虛讀和不可重讀可能發生

可重復讀:避免了臟讀,不可重復讀,但虛讀可能發生。

串行化:最安全,啥都能隔離。

在hibernate中,有默認的隔離級別

可以通過代碼來改動隔離級別,在hibernate.cfg.xml中,<property name="hibernate.connection.isolation">1/2/4/8</property>

一般mysql默認4,oracle默認2.

技術分享圖片

樂觀鎖中,在javabean中添加一個屬性:private Integer verson;並且在在實體類配置文件中加上<version name="verson"/>

小白的進階之路11