hibernate要點(轉載)
hibernate要點
1.兩種配置檔案:
A.hibernate.cfg.xml 和 B.hibernate.properties
A中可含對映檔案的配置,而B中hard codes加對映檔案。
A。Configuration config=new Configuration().config();
B. Configuration config=new Configuration();
config.addClass(TUser.class);
2.你不必一定用hibernate.cfg.xml或hibernate.properties這兩檔名,你也不一定非得把配置檔案放在
File file=new File("c://sample//myhibernate.xml");
Configuration config=new Configuration().config(file);
3. session.Flush()
強制資料庫立即同步,當用事務時,不必用flush,事務提交自動呼叫flush
在session關閉時也會呼叫flush
4. Hibernate總是使用物件型別作為欄位型別
5. XDoclet專門建立了hibernate doclet,就是在java程式碼上加上一些
java docTag,後來再讓XDoclet
6.HQL子句本身大小寫無關,但是其中出現的類名和屬性名必須注意大小寫區分。
7.關係:
Constrained : 約束,表明主控表的主鍵上是否存在一個外來鍵(foreigh key)對其進行約束。
property-ref:關聯類中用於與主控類相關聯的屬性名,預設為關聯類的主鍵屬性名
單向一對多需在一方配置,雙向一對多需在雙方進行配置
8.lazy=false:被動方的記錄由hibernate負責記取,之後存放在主控方指定的
Collection型別屬性中
9. java.util.Set或net.sof.hibernate.collecton.Bag
10.重要:inverse:用於標識雙向關聯中的被動方一端。
inverse=false的一方(主控方)負責維護關聯關係.預設值:false
11.batch-size:採用延遲載入特徵時,一次讀入的資料數昨。
12.一對多通過主控方更新(主控方為一方時)
user.getAddresses().add(addr);
session.save(user);//通過主控物件級聯更新
13.在one-to-many 關係中,將many 一方設為主動方(inverse=false)將有助效能的改善。在一方設定關係時,inverse=true,即將主控權交給多方,這樣多方可主動從一方獲得foreign key,然後一次insert即可完工。
addr.setUser(user);//設定關聯的TUser物件
user.getAddresses().add(addr);
session.save(user);//級聯更新
14.只有設為主控方的一方才關心(訪問)對方的屬性,被動方是不關心對方的屬性的。
15.one-to-many與many-to-one節點的配置屬性不同:一對多關係多了lazy和inverse兩個屬性多對多節點屬性:column:中間對映表中,關聯目標表的關聯欄位
class:類名,關聯目標類
outer-join:是否使用外聯接
注意:access是設定屬性值的讀取方式。
column是設定關聯欄位。
16.多對多,注意兩方都要設定inverse和lazy,cascade只能設為insert-update
多對多關係中,由於關聯關係是兩張表相互引用,因此在儲存關係狀態時必須對雙方同時儲存。
group1.getRoles().add(role1);
role1.getGroups().add(group1);
session.save(role1);
session.save(group1);
17.關於vo和po
vo經過hibernate容量處理,就變成了po(該vo的引用將被容器儲存,並且在session關閉時flush,因此po如果再傳到其它地方改變了,就危險了)
vo和po相互轉換:BeanUtils.copyProperties(anotherUser,user);
18.對於save操作而言,如果物件已經與Session相關聯(即已經被加入Session的實體容器中),則無需進行具體的操作。因為之後的Session.flush過程中,Hibernate
會對此實體容器中的物件進行遍歷,查找出發生變化的實體,生成並執行相應的update
語句。
19.如果我們採用了延遲載入機制,但希望在一些情況下,實現非延遲加載時的功能,也就是說,我們希望在Session關閉後,依然允許操作user的addresses
屬性
Hibernate.initialize方法可以通過強制載入關聯物件實現這一功能:這也正是我們為什麼在編寫POJO時,必須用JDK Collection介面(如Set,Map),
而非特定的JDK Collection實現類(如HashSet、HashMap)申明Collection屬性的原因。
20.事務:從sessionFactory獲得session,其自動提交屬性就已經關閉(AutoCommit=false),此時若執行了jdbc操作,如果不顯式呼叫session.BeginTransaction(),是不會執行事務操作的。
jdbc transaction:基於同一個session(就是同一個connection)的事務;
jta transaction:跨session(跨connection)事務.
對於jta事務,有三種實現方法:
A。UserTransaction tx=new InitialContext().lookup("...");
tx.commit();
B. 使用hibernate封裝的方法:(不推薦)
Transaction tx=session.beginTransaction();
tx.commit();
C. 使用ejb之sessionBean的事務技持方法,你只要在把需要在釋出描述符中,把需要jta事務的方法宣告為require即可
21.悲觀鎖,樂觀鎖:樂觀鎖一般通過version來實現,注意version節點必須出現在id後。
22.Hibernate中,可以通過Criteria.setFirstResult和Criteria.setFetchSize方法設定分頁範圍。
Query介面中也提供了與其一致的方法,hibernate主要在dialect類中實現在這個功能。
23.cache
……
net.sf.ehcache.hibernate.Provider
還需對ecache本身進配置
maxElementsInMemory="10000" //Cache中最大允許儲存的資料數量
eternal="false" //Cache中資料是否為常量
timeToIdleSeconds="120" //快取資料鈍化時間
timeToLiveSeconds="120" //快取資料的生存時間
overflowToDisk="true" //記憶體不足時,是否啟用磁碟快取
/>
之後在對映檔案中指定各個對映實體的cache策略
....
....
*****************************************************
Query.list()跟Query.iterate()的不同:對於query.list()總是通過一條sql語句獲取所有記錄,然後將其讀出,填入pojo返回;
但是query.iterate(),則是首先通過一條Select SQL 獲取所有符合查詢條件的記錄的
id,再對這個id 集合進行迴圈操作,通過單獨的Select SQL 取出每個id 所對應的記錄,之後填入POJO中返回。
也就是說,對於list 操作,需要一條SQL 完成。而對於iterate 操作,需要n+1
條SQL。,list方法將不會從Cache中讀取資料。iterator卻會。
24.ThreadLocal:它會為每個執行緒維護一個私有的變數空間。實際上,其實現原理是在JVM 中維護一個Map,這個Map的key 就是當前的執行緒物件,而value則是執行緒通過ThreadLocal.set方法儲存的物件例項。當執行緒呼叫ThreadLocal.get方法時,
ThreadLocal會根據當前執行緒物件的引用,取出Map中對應的物件返回。
這樣,ThreadLocal通過以各個執行緒物件的引用作為區分,從而將不同執行緒的變數隔離開來。
25.Hibernate官方開發手冊標準示例:
public class HibernateUtil {
private static SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory
sessionFactory = new
Configuration().configure().buildSessionFactory();
} catch (HibernateException ex) {
throw new RuntimeException(
"Configuration problem: " + ex.getMessage(),
ex
);
}
}
public static final ThreadLocal session = new ThreadLocal();
public static Session currentSession() throws HibernateException
{
Session s = (Session) session.get();
// Open a new Session, if this Thread has none yet
if (s == null) {
s = sessionFactory.openSession();
session.set(s);
}
return s;
}
public static void closeSession() throws HibernateException {
Session s = (Session) session.get();
session.set(null);
if (s != null)
s.close();
}
}
26.通過filter實現session的重用:
public class PersistenceFilter implements Filter
{
protected static ThreadLocal hibernateHolder = new ThreadLocal();
public void doFilter(ServletRequest request, ServletResponse
response, FilterChain chain)
throws IOException, ServletException
{
hibernateHolder.set(getSession());
try
{
……
chain.doFilter(request, response);
……
}
finally
{
Session sess = (Session)hibernateHolder.get();
if (sess != null)
{
hibernateHolder.set(null);
try
{
sess.close();
}
catch (HibernateException ex) {
throw new ServletException(ex);
}
}
}
}
……}
相關推薦
hibernate要點(轉載)
hibernate要點1.兩種配置檔案: A.hibernate.cfg.xml 和 B.hibernate.properties A中可含對映檔案的配置,而B中hard codes加對映檔案。 A。Configuration config=new Conf
Netty系列之Netty百萬級推送服務設計要點-轉載
1. 背景 1.1. 話題來源 最近很多從事移動網際網路和物聯網開發的同學給我發郵件或者微博私信我,諮詢推送服務相關的問題。問題五花八門,在幫助大家答疑解惑的過程中,我也對問題進行了總結,大概可以歸納為如下幾類: Netty是否可以做推送伺服器? 如果使用Netty開
Spring MVC-集成(Integration)-Hibernate驗證器示例(轉載實踐)
標準 ttr als 配置 solid ber 對象 ida suffix 以下內容翻譯自:https://www.tutorialspoint.com/springmvc/springmvc_hibernate_validator.htm 說明:示例基於Spring M
Hibernate【緩存】知識要點
常用 以及 provide 懶加載 更改 pub 語句 com 效率 對象狀態 Hibernate中對象的狀態: 臨時/瞬時狀態 持久化狀態 遊離狀態 學習Hibernate的對象狀態是為了更清晰地知道Hibernate的設計思想,以及是一級緩存的基礎...當然啦,也就
HIbernate和Mybatis的區別和優劣勢[轉載]
統計 算法 高版本 抓取 一級緩存 mybatis sql優化 hiberna 優秀 第一章 Hibernate與MyBatis Hibernate 是當前最流行的O/R mapping框架,它出身於sf.net,現在已經成為Jboss的一部分。 Mybatis 是
[轉載總結]Linux環境下C++運行時動態鏈接庫加載要點總結
typedef symbol 類的方法 cout use per 解析 轉換 type 最近在看的一些web服務器源碼的擴展部分基本上都使用到了.so動態庫的運行時加載,也遇到了不少坑,看了不少網上的博客,在這裏稍微總結轉載一下,也是為了以後少走彎路。 首先需要了解的就是靜
轉載:app測試要點
蟲師部落格:https://www.cnblogs.com/fnng/p/8679185.html APP測試點總結(全面) 原文地址:https://www.jianshu.com/p/3b8ee2901850 1.功能性測試: ——根據產品需求文件編寫測試用例。 ——軟體設計
hibernate實體類之間的一對一關係(轉載)
one-to-one 元素 屬性: name:對映類屬性的名字 class:對映的目標類 cascade:設定操作中的級聯策略 可選值為 all所有操作情況均進行級聯、none所有操作情況均不進行級聯、save-update執行更新操作時級聯、delete執行刪除操作時
[轉載]第三方支付系統性能測試要點分析
自2010年06月21日中國人民銀行公佈《非金融機構支付服務管理辦法》以來,針對非金融機構“支付業務許可證”的申請及檢測認證工作已經逐步展開。中國評測作為權威的、獨立的第三方檢測機構,也在第一時間對非金融機構第三方支付系統的檢驗認證方法進行了細緻的研究。下面,我們將結合央行
Hibernate使用要點
Hibernate 是一個優秀的持久層的ORM(物件關係對映)框架,對JDBC進行了輕量級的封裝,由於它可以自動生成sql語句自動執行,因此可以讓我們使用物件程式設計的思想來操作資料庫,簡化了資料操作的繁雜性。O: Object物件,面嚮物件語言領域,Java中的JavaBe
hibernate update 只更新部分欄位的3種方法(轉載)
hibernate 中如果直接使用 Session.update(Object o); 會把這個表中的所有欄位更新一遍。 比如: public class Teacher Test { @Test public void update(){ Session session
Hibernate面試要點
get和load的區別: 1>不存在對應記錄時表現不一樣 2>load返回的是代理物件(javassist.jar生成二進位制碼),等到真正用到物件的內容才會發出SQL語句 3>get直接從資料庫載入,不會延遲 無論是get還是load,都會首先查詢快取
JSF+Spring+Hibernate的例項講解(轉載)
我一直認為jsf必定會成為MS的 Net Freamwork的競爭對手。但,jsf尚在發展階段。至少目前不會。JSF使用原文地址:http://www.javaworld.com/javaworld/jw-07-2004/jw-0719-jsf.html使用JavaServe
【轉載】Myeclipse如何自動建立hibernate
Myeclipse如何自動建立hibernate:http://jingyan.baidu.com/article/456c463b99f4370a583144a8.html An internal e
hibernate學習要點指引
最近幾天,團隊有幾個人在blog上開始貼自己學習hibernate的一些程式碼和心得了。昨天幫他們除錯程式碼的時候,才對他們最近的學習過程有一個瞭解。回想兩年多前,自己開始hibernate學習的過程,貼點東西在這裡。 不懂技術的人或者技術新手往往容易被“框架”二字所唬住,
(轉載)C++的一些要點
1.const 示例程式碼: #include <iostream>int main(void){ int x = 3; const int y = x; const int *p = &y; const int *c = &x; //err
hibernate 實現多表連線查詢(轉載)
http://www.cnblogs.com/lihuiyy/archive/2013/03/28/2987531.html為了方便,直接粘過來,方便檢視。不收藏了Hibernate主要支援兩種查詢方式:HQL查詢和Criteria查詢。前者應用較為廣發,後者也只是呼叫封裝好的介面。 現在有一個問題,就是實
Hibernate開發要點
1.兩種配置檔案: A.hibernate.cfg.xml 和 B.hibernate.properties A中可含對映檔案的配置,而B中hard codes加對映檔案。 A。Configuration config=new Configurati
Hibernate效能優化要點
1.儘量使用many-to-one,避免使用單項one-to-many 2.靈活使用單向one-to-many 3.不用一對一,使用多對一代替一對一 4.配置物件快取,不使用集合快取 5.一對多使用Bag 多對一使用Set 6.繼承使用顯示多型 HQL:from object polymorphism="
hibernate 獲取實體的表名、主鍵名、列名(轉載+修改)
package com.escs.utils; import java.util.Iterator; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.cfg.Config