Hibernate樂觀鎖之Timestamp注意點

<timestamp name="updDate" column="UPD_DATE"></timestamp>

這個必須跟在id定義之後

這使用AP服務器的時間,而不是DB服務器的時間,來更新數據庫。

即更新數據庫時使用的是new Date(),而不是sysdate。

如果要使用DB服務器時間來更新DB,必須加上source="db"

此時,hibernate會先從數據庫中取出當前時間(select sysdate from dual),然後再用該時間進行更新。

並不是嚴格意義上的用sysdate更新數據庫(update table1 set upd_date=sysdate ……)。

如果更新結果中沒有毫秒信息,請檢查Dialect,應使用org.hibernate.dialect.Oracle10gDialect。(Oracle9及其後續版本應該都支持毫秒)

不要使用org.hibernate.dialect.OracleDialect,該類已經被Deprecated。

使用org.hibernate.dialect.Oracle10gDialect之後,取DB時間的SQL會變爲 select systimestamp from dual。


Hibernate使用Criteria,除了默認的關聯條件之外,添加額外的關聯條件:createAlias("xxxx", "b",Criteria.LEFT_JOIN,criteria)。


<set name="MUpdateFuncTabs" table="M_UPDATE_FUNC_TAB" inverse="true" lazy="false" fetch="join">

或者criteria.setFetchMode("MUpdateFuncTabs", FetchMode.JOIN)

在一般情況下,只執行一條SQL語句就能把主表和副表的數據都取回來。但是join會導致檢索結果增多,結果件數爲join之後的件數……

但是如果在criteria中指定了副表的關聯查詢條件

criteria.createAlias("MUpdateFuncTabs", "tabs", JoinType.LEFT_OUTER_JOIN, Restrictions.eq(MUpdateFuncTab.DEL_FLG, Constant.DEL_FLG_VALID));

那麼,就會變成fetch="select"一樣的效果,將會執行N條SQL語句以取得副表的數據。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章