原文:
http://blog.csdn.net/sunsnow8/archive/2005/03/05/312359.aspx1.兩種配置文件:
? 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這兩文件名,
?? 你也不一定非得把配置文件放在Classes下,
?? File file=new File("c:\\sample\\myhibernate.xml");
?? Configuration config=new Configuration().config(file);
3. session.Flush()
?? 強制數(shù)據(jù)庫立即同步,當(dāng)用事務(wù)時,不必用flush,事務(wù)提交自動調(diào)用flush
?? 在session關(guān)閉時也會調(diào)用flush
4. Hibernate總是使用對象類型作為字段類型
5. XDoclet專門建立了hibernate doclet,就是在java代碼上加上一些
?? java docTag,后來再讓XDoclet分析該java代碼,生成映射文件;
6.HQL子句本身大小寫無關(guān),但是其中出現(xiàn)的類名和屬性名必須注意大小寫區(qū)分。
7.關(guān)系:
? Constrained : 約束,表明主控表的主鍵上是否存在一個外鍵(foreigh key)
?? 對其進行約束。
? property-ref:關(guān)聯(lián)類中用于與主控類相關(guān)聯(lián)的屬性名,默認(rèn)為關(guān)聯(lián)類的主鍵屬性名
? 單向一對多需在一方配置,雙向一對多需在雙方進行配置
8.lazy=false:被動方的記錄由hibernate負(fù)責(zé)記取,之后存放在主控方指定的
? Collection類型屬性中
9. java.util.Set或net.sof.hibernate.collecton.Bag類型的Collection
10.重要:inverse:用于標(biāo)識雙向關(guān)聯(lián)中的被動方一端。
???????? inverse=false的一方(主控方)負(fù)責(zé)維護關(guān)聯(lián)關(guān)系.默認(rèn)值:false
11.batch-size:采用延遲加載特征時,一次讀入的數(shù)據(jù)數(shù)昨。
12.一對多通過主控方更新(主控方為一方時)
?? user.getAddresses().add(addr);
?? session.save(user);//通過主控對象級聯(lián)更新 ?
13.在one-to-many 關(guān)系中,將many 一方設(shè)為主動方(inverse=false)將有助性能
?? 的改善。在一方設(shè)置關(guān)系時,inverse=true,即將主控權(quán)交給多方,
?? 這樣多方可主動從一方獲得foreign key,然后一次insert即可完工。
?? addr.setUser(user);//設(shè)置關(guān)聯(lián)的TUser對象
?? user.getAddresses().add(addr);
?? session.save(user);//級聯(lián)更新?
14.只有設(shè)為主控方的一方才關(guān)心(訪問)對方的屬性,被動方是不關(guān)心對方的屬性的。
15.one-to-many與many-to-one節(jié)點的配置屬性不同:
?? 一對多關(guān)系多了lazy和inverse兩個屬性
?? 多對多節(jié)點屬性:column:中間映射表中,關(guān)聯(lián)目標(biāo)表的關(guān)聯(lián)字段
?????????????????? class:類名,關(guān)聯(lián)目標(biāo)類
?????????????????? outer-join:是否使用外聯(lián)接?? ?
?? 注意:access是設(shè)置屬性值的讀取方式。
??????? column是設(shè)置關(guān)聯(lián)字段。
16.多對多,注意兩方都要設(shè)置inverse和lazy,cascade只能設(shè)為insert-update
?? 多對多關(guān)系中,由于關(guān)聯(lián)關(guān)系是兩張表相互引用,因此在保存關(guān)系狀態(tài)時必須對雙方同時保存。
?? group1.getRoles().add(role1);
?? role1.getGroups().add(group1);
?? session.save(role1);
?? session.save(group1);
17.關(guān)于vo和po
?? vo經(jīng)過hibernate容量處理,就變成了po(該vo的引用將被容器保存,并且在session關(guān)閉時flush,因此po如果再傳到其它地方改變了,就危險了)
?
?? vo和po相互轉(zhuǎn)換:BeanUtils.copyProperties(anotherUser,user);
18.對于save操作而言,如果對象已經(jīng)與Session相關(guān)聯(lián)(即已經(jīng)被加入Session的實體容器中),則無需進行具體的操作。因為之后的Session.flush過程中,Hibernate
會對此實體容器中的對象進行遍歷,查找出發(fā)生變化的實體,生成并執(zhí)行相應(yīng)的update
語句。
19.如果我們采用了延遲加載機制,但希望在一些情況下,實現(xiàn)非延遲加
載時的功能,也就是說,我們希望在Session關(guān)閉后,依然允許操作user的addresses
屬性
Hibernate.initialize方法可以通過強制加載關(guān)聯(lián)對象實現(xiàn)這一功能:
這也正是我們?yōu)槭裁丛诰帉慞OJO時,必須用JDK Collection接口(如Set,Map),
而非特定的JDK Collection實現(xiàn)類(如HashSet、HashMap)申明Collection屬性的
原因。
20.事務(wù):從sessionFactory獲得session,其自動提交屬性就已經(jīng)關(guān)閉(AutoCommit=false),此時若執(zhí)行了jdbc操作,如果不顯式調(diào)用session.BeginTransaction(),是不會執(zhí)行事務(wù)操作的。
?? jdbc transaction:基于同一個session(就是同一個connection)的事務(wù);
?? jta? transaction:跨session(跨connection)事務(wù).
?? 對于jta事務(wù),有三種實現(xiàn)方法:
???? A。UserTransaction tx=new InitialContext().lookup("...");
??????? tx.commit();
???? B. 使用hibernate封裝的方法:(不推薦)
??????? Transaction tx=session.beginTransaction();
??????? tx.commit();
???? C. 使用ejb之sessionBean的事務(wù)技持方法,你只要在把需要在發(fā)布描述符中,把需要jta事務(wù)的方法聲明為require即可
21.悲觀鎖,樂觀鎖:
?? 樂觀鎖一般通過version來實現(xiàn),注意version節(jié)點必須出現(xiàn)在id后。
22.Hibernate中,可以通過Criteria.setFirstResult和Criteria.setFetchSize方法設(shè)定分頁范圍。
?? Query接口中也提供了與其一致的方法,hibernate主要在dialect類中實現(xiàn)在這個功能。
23.cache
?? <hibernate-configuration>
?<session-factory>
?……
??<property name="hibernate.cache.provider_class">
???net.sf.ehcache.hibernate.Provider
??</property>?
? 還需對ecache本身進配置
? <ehcache>
?<diskStore path="java.io.tmpdir"/>
?<defaultCache
?maxElementsInMemory="10000" //Cache中最大允許保存的數(shù)據(jù)數(shù)量
?eternal="false" //Cache中數(shù)據(jù)是否為常量
?timeToIdleSeconds="120" //緩存數(shù)據(jù)鈍化時間
?timeToLiveSeconds="120" //緩存數(shù)據(jù)的生存時間
?overflowToDisk="true" //內(nèi)存不足時,是否啟用磁盤緩存
?/>
? </ehcache>
? 之后在映射文件中指定各個映射實體的cache策略
? <class name=" org.hibernate.sample.TUser" .... >
?<cache usage="read-write"/>
?....
?<set name="addresses" .... >
??<cache usage="read-only"/>
?....
?</set>
?</class>
?*****************************************************
?Query.list()跟Query.iterate()的不同:
?對于query.list()總是通過一條sql語句獲取所有記錄,然后將其讀出,填入pojo返回;
?但是query.iterate(),則是首先通過一條Select SQL 獲取所有符合查詢條件的記錄的
id,再對這個id 集合進行循環(huán)操作,通過單獨的Select SQL 取出每個id 所對應(yīng)的記
錄,之后填入POJO中返回。
?也就是說,對于list 操作,需要一條SQL 完成。而對于iterate 操作,需要n+1
條SQL。,list方法將不會從Cache中讀取數(shù)據(jù)。iterator卻會。
24.ThreadLocal:它會為每個線程維護一個私有的變量空間。實際上,
其實現(xiàn)原理是在JVM 中維護一個Map,這個Map的key 就是當(dāng)前的線程對象,而value則是
線程通過ThreadLocal.set方法保存的對象實例。當(dāng)線程調(diào)用ThreadLocal.get方法時,
ThreadLocal會根據(jù)當(dāng)前線程對象的引用,取出Map中對應(yīng)的對象返回。
?這樣,ThreadLocal通過以各個線程對象的引用作為區(qū)分,從而將不同線程的變量隔離開
來。
25.Hibernate官方開發(fā)手冊標(biāo)準(zhǔn)示例:
? 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實現(xiàn)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);
}
}
}
}
……}
27.Spring的參數(shù)化事務(wù)管理功能相當(dāng)強大,筆者建議在基于Spring Framework的應(yīng)用
開發(fā)中,盡量使用容器管理事務(wù),以獲得數(shù)據(jù)邏輯代碼的最佳可讀性。
?
public class UserDAO extends HibernateDaoSupport implements IUserDAO
{
public void insertUser(User user) {
getHibernateTemplate().saveOrUpdate(user);
}
}
? 上面的UserDAO實現(xiàn)了自定義的IUserDAO接口,并擴展了抽象類:
HibernateDaoSupport
HibernateSupport實現(xiàn)了HibernateTemplate和SessionFactory實例的關(guān)聯(lián)。
HibernateTemplate對Hibernate Session操作進行了封裝,而
HibernateTemplate.execute方法則是一封裝機制的核心
? *在spring的配置文件里,移植了整個hibernate.cfg.xml的內(nèi)容。
原文:
http://blog.csdn.net/sunsnow8/archive/2005/03/05/312359.aspx
?
JSP 動作的作用
JSP動作利用XML語法格式的標(biāo)記來控制Servlet引擎的行為。利用JSP動作可以動態(tài)地插入文件、重用JavaBean組件、把用戶重定向到另外的頁面、為Java插件生成HTML代碼,通過標(biāo)記庫定義自定義標(biāo)記
-----起始標(biāo)記
-----結(jié)束標(biāo)記
-------空標(biāo)記
包括:
<jsp:include>
<jsp:param>
<jsp:forward>
<jsp:plugin>
<jsp:useBean>
<jsp:setProperty>
<jsp:getProperty>
<jsp:useBean>標(biāo)記
創(chuàng)建Bean或從服務(wù)器獲得現(xiàn)有Bean
語法:
<jsp:useBean? id="bean name" class="class name" />
或者
<jsp:useBean? id="bean name" class="class name ">
? 初始化代碼
</jsp:useBean>
jsp:useBean動作用來裝載一個將在JSP頁面中使用的JavaBean。這個功能非常有用,因為它使得我們既可以發(fā)揮Java組件重用的優(yōu)勢,同時也避免了損失JSP區(qū)別于Servlet的方便性 !
獲得Bean實例之后,要修改Bean的屬性既可以通過jsp:setProperty動作進行,也可以在Scriptlet中利用id屬性所命名的對象變量,通過調(diào)用該對象的方法顯式地修改其屬性 .
id屬性-在整個頁面引用Bean的唯一值
Bean名稱的規(guī)則:
????? 唯一
區(qū)分大小寫
第一個字符必須為字母
不允許有空格
可為同一 Bean 類指定不同的 id 值.
class 屬性-JavaBean 的類名
---Count Bean不屬于包
???????????? <jsp:useBean id="count" class="Count" />
-----Count Bean屬于test包
???????????? <jsp:useBean id="count" class="test.Count" />
type屬性---------將引用此對象的變量的類型
beanName 屬性-指定串行化Bean的名稱
scope 屬性-表明Bean應(yīng)可用的環(huán)境
----page
----session
----request
-----application
page 作用域
將 JavaBean 對象存儲在當(dāng)前頁面的 javax.servlet.jsp.PageContext 中
JavaBean 對象僅可用于當(dāng)前頁面
session 作用域
將 JavaBean 對象存儲在 HTTP 會話中
JavaBean 對象在當(dāng)前 HttpSession 的生命周期內(nèi)可用于所有頁面
request 作用域
將 JavaBean 對象存儲在當(dāng)前 ServletRequest 中
JavaBean 對象可用于被包括的 JSP 頁面
application 作用域
將 JavaBean 對象存儲在 ServletContext 中
JavaBean 對象可用于共享同一 ServletContext 的所有頁面
非空 useBean 標(biāo)記僅在新建 Bean 實例時才會處理標(biāo)記的內(nèi)容
<jsp:useBean id="currentuser" class="CurrentUser" scope="session">
??? Hello,new user!!!
</jsp:useBean>
?
<jsp:getProperty>標(biāo)記
檢索 Bean 屬性的值,將此值轉(zhuǎn)換成字符串,并插入輸出結(jié)果中
name 屬性-指定 Bean 的名稱
property 屬性-指定 Bean 的屬性
<jsp:getProperty name="bean name" property="property name"/>
<jsp:setProperty>標(biāo)記
設(shè)置 Bean 類的屬性
name 屬性-指定 Bean 的名稱
property 屬性-指定 Bean 的屬性
value 屬性-指定要設(shè)置的值
<jsp:setProperty name="bean name" property="property name" value="str" />
jsp:setProperty動作有下面四個屬性:
?name屬性是必需的。它表示要設(shè)置屬性的是哪個Bean。
property property屬性是必需的。它表示要設(shè)置哪個屬性。
有一個特殊用法:如果property的值是“*”,表示所有名字和Bean屬性名字匹配的請求參數(shù)都將被傳遞給相應(yīng)的屬性set方法。
value屬性是可選的。該屬性用來指定Bean屬性的值。字符串?dāng)?shù)據(jù)會在目標(biāo)類中通過標(biāo)準(zhǔn)的valueOf方法自動轉(zhuǎn)換成數(shù)字、boolean、Boolean、byte、Byte、char、Character。例如,boolean和Boolean類型的屬性值(比如“true”)通過Boolean.valueOf轉(zhuǎn)換,int和Integer類型的屬性值(比如“42”)通過Integer.valueOf轉(zhuǎn)換。?
value和param不能同時使用,但可以使用其中任意一個
?param是可選的。它指定用哪個請求參數(shù)作為Bean屬性的值。如果當(dāng)前請求沒有參數(shù),則什么事情也不做,系統(tǒng)不會把null傳遞給Bean屬性的set方法。因此,你可以讓Bean自己提供默認(rèn)屬性值,只有當(dāng)請求參數(shù)明確指定了新值時才修改默認(rèn)屬性值。
例如,下面的代碼片斷表示:如果存在numItems請求參數(shù)的話,把numberOfItems屬性的值設(shè)置為請求參數(shù)numItems的值;否則什么也不做。
<jsp:setProperty name="orderBean"? property="numberOfItems"? param="numItems" />?
如果同時省略value和param,其效果相當(dāng)于提供一個param且其值等于property的值。進一步利用這種借助請求參數(shù)和屬性名字相同進行自動賦值的思想,你還可以在property(Bean屬性的名字)中指定“*”,然后省略value和param。此時,服務(wù)器會查看所有的Bean屬性和請求參數(shù),如果兩者名字相同則自動賦值。
<jsp:forward>標(biāo)記
將控制權(quán)傳輸至本地服務(wù)器上的另一地址
page 屬性-指定替代地址
可為靜態(tài)值,也可在請求時計算
語法:
<jsp: forward page = "localURL" />
<jsp:forward page=“/utils/errorReporter.jsp” />
<jsp:forward page="<%= someJavaExpression %>" />
<jsp:include>標(biāo)記
可將另一個頁面生成的內(nèi)容包括在當(dāng)前頁面的輸出結(jié)果中
也可包括Servlet
page 屬性-要插入當(dāng)前頁面的文檔
flush 屬性-是否刷新當(dāng)前頁面的緩沖器
<jsp:param> 標(biāo)記指定附加的 request 參數(shù)
<jsp:include page="localURL" flush="true" >
?<jsp:param name="parameterName1" value="parameterValue1" />
? <jsp:param name="parameterNameN" value="parameterValueN" />
<jsp:include page="localURL" flush="true" />
?
include 指令和 include 動作的區(qū)別
動重新編譯和類大小
靜態(tài)或動態(tài)內(nèi)容的包括
合并主頁和包括的頁面的時間
共享局部變量
修改的生效
變量的作用域
include指令,它是在JSP文件被轉(zhuǎn)換成Servlet的時候引入文件,而這里的jsp:include動作不同,插入文件的時間是在頁面被請求的時候!
整理的有點亂。恐怕就我自己看的懂了(暈)...
Struts Logic 標(biāo)簽庫中的標(biāo)簽可以根據(jù)特定的邏輯條件來控制輸出網(wǎng)頁的內(nèi)容
,或者循環(huán)遍歷集合中的所有元素,先來回顧一下Logic標(biāo)簽庫中一些標(biāo)簽吧。。
進行比較運算的Logic標(biāo)簽
進行字符串匹配的Logic標(biāo)簽
判斷指定內(nèi)容是否存在的Logic標(biāo)簽
進行循環(huán)遍歷的標(biāo)簽
進行請求轉(zhuǎn)發(fā)或重定向的Logic標(biāo)簽
進行比較運算的Logic標(biāo)簽
<logic:equal>?????? 比較變量是否等于指定的常量
<logic:notEqual>??? 比較變量是否不等于指定的常量
<logic:greaterEqual>比較變量是否大于或等于指定的常量
<logic:greateThan>? 比較變量是否大于指定的常量
<logic:lessEqual>?? 比較變量是否小于或等于指定的常量
<logic:lesThan>???? 比較變量是否小于指定的常量
進行字符串匹配的Logic標(biāo)簽
<logic:match>????? 判斷變量中是否包含指定的常量字符串
<logic:notMatch>?? 判斷變量中是否不包含指定的常量字符串
判斷指定內(nèi)容是否存在的Logic標(biāo)簽
<logic:empty>???? 判斷變量中是否為空
<logic:netEmpty>? 判斷變量中是否不為空
<logic:present>?? 判斷指定的JavaBean . Cookie等 是否存在
<logic:notPresent>判斷指定的JavaBean . Cookie等 是否不存在
<logic:messagesPresent>??? 判斷指定的消息是否存在
<logic:messagesNotPresent>? 判斷指定的消息是否不存在
進行循環(huán)遍歷的標(biāo)簽
<logic:iterate>
它是Logic標(biāo)簽庫中最復(fù)雜的,也是用途最廣的一個標(biāo)簽。
進行請求轉(zhuǎn)發(fā)或重定向的Logic標(biāo)簽
<logic:forward>
<logic:redirect>
剛剛還看到了這篇http://www.tkk7.com/action/archive/2005/11/01/17707.aspx講的比較詳細(xì)。
我就懶的記了。。