hibernate學習筆記(三)
hibernate的一些雜記:
1.sessionFactory的用法:
SessionFactory是線程安全的,構造 SessionFactory 很消耗資源
sessionFactory = new Configuration().configure().addClass(**).addClass(**).buildSessionFactory();
Session session = sessionFactory.openSession();
在這裏addClass的好處是不需要在hibernate.cfg.xml中聲明domain中各個實體對應的配置文件
2.二級緩存
二級緩存中的類緩存,隻適用於ID查詢的方式(get()或load()),對於HQL的方式不可以,這個時候可以配置查詢緩存,使用查詢緩存需要先在hibernate.cfg.xml中開啟查詢緩存,然後在查詢到時候setCacheable(true).
時間戳緩存:指定hibernate的二級緩存會自動檢測,如果使用了update或delete語句,則會把數據清出緩存,重新查詢。注::但是這是一級緩存session中的內容不會被刷新,所以要手動refresh().
list()方法默認不會使用緩存,除非調用了SetCacheable(true),但是如果HQL一變或者參數一遍,緩存就失效了,但是用iterate()查詢,就可以。
3.iterate()查詢的原理:
先執行一個查詢,查詢所有的符合條件的ID,再使用每一個對象時,會根據ID去緩存中查,如果查得到直接使用,如果查不到,那麼就查出緩存中沒有的相應數據。
4.關於級聯
在設置了關聯關係以後,如果主從對象存在級聯關係,可以用cascade屬性來設置,在使用時應仔細分析對象的級聯關係,是否需要級聯刪除等操作。
5.在使用的時候
從對象的角度來說:讓雙方都設置關聯關係比較好。所以用inverse屬性配置是否由對方維護關聯關係。一般都是讓一的一方去放棄維護關聯關係。為了使查詢的集合元素有順序,可以配置order-by屬性
從數據庫的角度來說,隻要讓一方設置關聯就可以。所以在用時候可以讓一的一方維護多的一方,也可以讓多的一方維護一的一方。這樣都會比雙方同時維護性能要好。但是這樣做的效果缺點是:代碼不清晰。
注::在一對多中,維護關聯關係就是指更新外鍵的值
在save的時候應該先保存無外鍵的一方,再保存有外鍵的一方(基於外鍵的一對一也同樣),這樣會節省一個update語句
6.主鍵生成策略:native---數據庫的自動增長(oracle不支持)(identity,sequence[oracle],hilo)increment存在多線程問題。聯合主鍵
7.DML語句不經過緩存,要手動session.refresh();
8. Query和Criteria接口
都是查詢接口,Query實例包裝了HQL查詢語句,hql是麵向對象的,他引用類名及類的屬性名,而不是表名和字段名。Criteria接口完全封裝了基於字符串形式的查詢語句,比Query接口更麵向對象,他擅長執行動態查詢
9. Hibernate訪問持久化類屬性的策略
propertye(默認值):
表明hibernate通過getXXX和setXXX來訪問類屬性。推薦使用。提高域模型透明性。
field
hibernate通過java反射機製直接訪問類屬性。對於沒有get與set方法的屬性可設置該訪問策略。
noop
它映射Java持久化類中不存在的屬性,即主要用於HQL(用query接口測試,使用hql語句)中,當數據庫中有某列,而實體中不存在的情況。
<!-- 該屬性在Customer類中有get與set方法 -->
<property name="name" column="name"type="string"/>
<!-- 該屬性在Customer類中不存在get和set方法 -->
<property name="name" column="name"type="string" access="field" />
<!-- 該屬性在Customer類中不存在,但在數據庫存在該字段。
使用noop處理,查詢的時候忽略該字段-->
<property name="name"column="name" type="string" access="noop"/>
10.利用<property>元素的formula屬性,用來設置一個sql表達式,hibernate將根據它來計算出派生屬性的值。
如果指定了formula 屬性,則就會insert=”false” update=”false”
11.java與Hibernate如何區分對象
Java語言按內存地址(==)或equals()方法區分不同的對象
Hibernate中用對象表示符(OID)來區分對象
OID是關係數據庫中的主鍵在java對象模型中的等價物。在運行時,hibernate根據OID來維持java對象和數據庫記錄的對應關係。
Hibernate使用OID來區分對象,不是equals()方法!所以不重寫持久化類的hashCode()與equals()方法Hibernate也可以正確運行(但要放到HashSet等集合中時要注意需要重寫這兩個方法)。
12. List是有序集合,因此持久化到數據庫時必須增加一列來表示集合元素的次序。集合屬性隻能以接口聲明(當持久化某個實例時, Hibernate 會自動把程序中的集合實現類替換成 Hibernate 自己的集合實現類)
list元素要求用list-index的子元素來映射有序集合的次序列。
集合的屬性的值會存放有另外的表中,須以外鍵關聯,用 Key 元素來映射外鍵列
13.在映射一對多的雙向關聯關係時,應該在one方把inverse屬性設為true, 這可以提高性能。
在建立兩個對象的關聯時,應該同時修改關聯兩端的相應屬性,這樣才會使程序更加健壯,提高業務邏輯層的獨立性,使業務邏輯層的程序代碼
不受Hibernate實現類的影響。同理,當刪除雙向關聯的關係時,也應該修改關聯兩端的對象的相應屬性.
14.update 、saveOrUpdate、 meger區別與用法
通常下麵的場景會使用 update()
或 saveOrUpdate()
:
最後更新:2017-04-02 06:52:08