小白的進階之路11
想著做個項目,奈何前端是我的弱項,只會寫一下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