熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

JSF和Hibernate的比較

2013-11-23 20:10:40  來源: Java開源技術 

  at backing bean:

  List list= new ArrayList();

  for(int i=;i<;i++){

  Object[] obj=new Object[];

  User user =new User();

  obj[] =user;

  Group group =new Group();

  obj[]= group;

  listadd(obj);

  }

  at jsp

  <t:datatable value=#{xxxBeangetList}  var=obj>

  <t:column =#{objuserusername}/>

  <t:column=#{objgroupgroupname}/>

  </t:datatable>

  為什麼要提到這個呢?是因為hibernate的nativeSQL 可以查詢多多個對象數組當你遇到到復雜邏輯需要自己定義sql去連接查詢多張表

  public List getJobSectionAndOutworkPoByHeaderId(Integer headerId)
{
         StringBuffer hql = new StringBuffer(select {j*}{p*} from (select * from est_job_section where header_id=)append(headerId);
         hqlappend() j left join est_outwork_po p on jjob_section_id =pjob_section_id);
         Query query = getSession()createSQLQuery(hqltoString())addEntity(jEstJobSectionclass)addEntity(pEstOutworkPoclass);
         List list = querylist();
         return list;
     }
    上面的這個方法查詢出來的對象就是一個對象類型的數組存放在List裡面無需轉換可以直接在頁面上顯示

  非常之方便

  關於hibernate的另外一個屬性inverse at mapping file在處理mapping時候的onetomany的時候有時候我們往子表裡插入一條記錄hibernate會自作多情地幫我們改動數據庫裡地數據比如說我們從student表裡查詢一條出來然後往數據庫裡再插入一條相當於copy一條我們希望這個student地groupid不要發生變化但是假如我們不在主表group裡設定inverse地話當我們插入一條新組新學生但是這個學生信息和組信息都是從數據庫裡copy出來而不是用戶在界面上填寫的(某項目的特別的需求)這樣就會在copy 組的時候沒有問題而在copy學生的時候會把源學生的groupid改掉---自動改掉粗略地估計是因為在session of hibernate裡有兩份reference借助spring地transation的管理機制不能釋放所以源數據就被同步掉了

  這樣的情況下可以通過在主表 Group表裡設定一個inverse=true來通知子表不要做任何的變動

  <set name=estEstimationHeaders inverse=true lazy=false>
             <key>
                 <column name=est_base_id />
             </key>
             <onetomany class=comviziaappboEstEstimationHeader />
         </set>


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28071.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.