隨筆-124  評論-49  文章-56  trackbacks-0
           
               摘要: 1111-1234 re \d{5}(-\d{4})? ?指前面的子項可有可無 11111 re (\d)\1{4} 1221 re (\d)(\d)\2\1 RegExp對象 創(chuàng)建方式: 1 使用RegExp對象顯式構(gòu)造函數(shù)new RegExp("pattern"[,"flags"]) 2 使用RegExp對象隱式構(gòu)造函數(shù)/pattern/[flags] flags參數(shù) g 用...  閱讀全文
          posted @ 2009-11-04 14:42 junly 閱讀(235) | 評論 (0)編輯 收藏

           大清早struts2的配置文件報錯The content of element type "package" must match "(result-types?,interceptors?,default-interceptor-ref?,default-action


          意思是我在配置文件中:
          result-types
          interceptors
          default-interceptor-ref
          default-action-ref
          default-class-ref
          global-results
          global-exception-mappings
          action*(就是所有的action放到最后)
          的順序有問題,仔細(xì)檢查了一遍也沒發(fā)現(xiàn)有什么錯誤,想想是不是action里面的順序有問題,(action里面的順序是可以任意放的)最終刷新了一下頁
          面好了,是IDE在作怪吧,記錄一下,以防下次再遇到。
          posted @ 2009-11-04 09:31 junly 閱讀(2623) | 評論 (0)編輯 收藏
          import org.hibernate.cfg.Configuration;
          import org.hibernate.tool.hbm2ddl.SchemaExport;


          public class Test {

              
          /**
               * 
          @param args
               
          */

              
          public static void main(String[] args) {
                  Configuration cfg
          =new Configuration().configure();
                  SchemaExport export
          =new SchemaExport(cfg);
                  export.create(
          truetrue);
              }


          }

          posted @ 2009-11-03 17:57 junly 閱讀(254) | 評論 (0)編輯 收藏
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd" >
          <hibernate-configuration>
            
          <session-factory>
                
          <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
                
          <property name="connection.url">jdbc:sqlserver://localhost:1433;DatabaseName=epai</property>
                
          <property name="connection.username">sa</property>
                
          <property name="connection.password">accp</property>
                
          <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
                
          <property name="hibernate.show_sql">true</property>
                
          <property name="hibernate.hbm2ddl.auto">update</property>
                
          <property name="hibernate.current_session_context_class">thread</property>
                
              
          <!-- 
                  <property name="hibernate.current_session_context_class">jta</property>
               
          -->
                
                
          <mapping resource="org/epai/entity/Users.hbm.xml"/>
                
          <mapping resource="org/epai/entity/Goods.hbm.xml"/>
                
          <mapping resource="org/epai/entity/Bid.hbm.xml"/>
            
          </session-factory>
          </hibernate-configuration>
          posted @ 2009-11-03 17:56 junly 閱讀(249) | 評論 (0)編輯 收藏
           

          HQL運算符

          QBC運算符

          含義

          =

          Restrictions.eq()

          等于equal

          <> 

          Restrictions.ne()

          不等于not equal

          > 

          Restrictions.gt()

          大于greater than

          >=

          Restrictions.ge()

          大于等于greater than or equal

          < 

          Restrictions.lt()

          小于less than

          <=

          Restrictions.le()

          小于等于less than or equal

          is null

          Restrictions.isnull()

          等于空值

          is not null

          Restrictions.isNotNull()

          非空值

          like

          Restrictions.like()

          字符串模式匹配

          and

          Restrictions.and()

          邏輯與

          and

          Restrictions.conjunction()

          邏輯與

          or

          Restrictions.or()

          邏輯或

          or

          Restrictions.disjunction()

          邏輯或

          not

          Restrictions.not()

          邏輯非

          in(列表)

          Restrictions.in()

          等于列表中的某一個值

          not in(列表)

          Restrictions.not(Restrictions.in())

          不等于列表中任意一個值

          between x and y

          Restrictions.between()

          閉區(qū)間xy中的任意值

          not between x and y

          Restrictions.not(Restrictions..between())

          小于值X或者大于值y

          //獲取記錄總數(shù)
          recordCount=Convert.ToInt32(criteria.SetProjection( Projections.Count(MovieUrl.__ID )) .UniqueResult(  ));

          criteria.SetProjection( 
          null );

          Criteria c
          =session.createCriteria(Book.class);

          c.add(Restrictions.like(
          "bookname""a",MatchMode.ANYWHERE));

          c.add(Restrictions.between(
          "bid"13));

          c.add(Restrictions.not(Restrictions.in(
          "bid"new Integer[]{1,2,4})));

          c.setFirstResult(
          0);     

          c.setMaxResults(
          2);    

          List list
          =c.list();

          Restrictions.like(“”,…,MatchMode.ANYWHERE)

          AddOrder(Order.asc(“fwid”))

          在oracle數(shù)據(jù)庫中,如果使用Restrictions.ne("name","張三"),不會包括該字段值為空的記錄
          posted @ 2009-11-03 17:46 junly 閱讀(5107) | 評論 (0)編輯 收藏
          junit簡介:
           * 創(chuàng)建test目錄與src同級,同時建立相同的包目錄
           * 編寫測試類xxxTest,需要繼承TestCase
           * 編寫單元測試方法,測試方法必須以test開頭,測試方法不能含有參數(shù)和返回值,如:
             public void testHello(){}
           * 最好單元測試的代碼單獨建立一個目錄
           * 斷言
             this.assertEquals("消息",2,hello.add(1,1));
           * protected void setUp() throws exception{}//相當(dāng)于init方法,可以自動調(diào)用
          posted @ 2009-11-03 17:44 junly 閱讀(195) | 評論 (0)編輯 收藏
          jdbc:mysql://127.0.0.1:3306/test_hibernate2?useUnicode=true&amp;characterEncoding=UTF-8
          posted @ 2009-11-03 17:43 junly 閱讀(174) | 評論 (0)編輯 收藏

          org.hibernate.criterion.DetachedCriteria的用法

          一 Hibernate 設(shè)計了 CriteriaSpecification 作為 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria 。
             1 Criteria 和 DetachedCriteria 的主要區(qū)別在于創(chuàng)建的形式不一樣, Criteria 是在線的,所
          以它是由 Hibernate Session 進(jìn)行創(chuàng)建的;而 DetachedCriteria 是離線的,創(chuàng)建時無需Session,DetachedCriteria 提供了 2 個靜態(tài)方法 forClass(Class) 或 forEntityName(Name)
          進(jìn)行DetachedCriteria 實例的創(chuàng)建。 Spring 的框架提供了getHibernateTemplate().findByCriteria(detachedCriteria) 方法可以很方便地根據(jù)DetachedCriteria 來返回查詢結(jié)果。
             2 Criteria 和 DetachedCriteria 均可使用 Criterion 和 Projection 設(shè)置查詢條件。可以設(shè)
          置 FetchMode( 聯(lián)合查詢抓取的模式 ) ,設(shè)置排序方式。對于 Criteria 還可以設(shè)置 FlushModel
          (沖刷 Session 的方式)和 LockMode (數(shù)據(jù)庫鎖模式)。
          二 下面對 Criterion 和 Projection 進(jìn)行詳細(xì)說明:
             1 Criterion 是 Criteria 的查詢條件。Criteria 提供了 add(Criterion criterion) 方法來
          添加查詢條件。
             2 Criterion 接口的主要實現(xiàn)包括: Example 、 Junction 和 SimpleExpression 。而
          Junction 的實際使用是它的兩個子類 conjunction 和 disjunction ,分別是使用 AND 和 OR 操
          作符進(jìn)行來聯(lián)結(jié)查詢條件集合。
             3 Criterion 的實例可以通過 Restrictions 工具類來創(chuàng)建,Restrictions 提供了大量的靜態(tài)
          方法,如 eq (等于)、 ge (大于等于)、 between 等來方法的創(chuàng)建 Criterion 查詢條件
          (SimpleExpression 實例)。除此之外, Restrictions 還提供了方法來創(chuàng)建 conjunction 和
          disjunction 實例,通過往該實例的 add(Criteria) 方法來增加查詢條件形成一個查詢條件集合。
             4 至于 Example 的創(chuàng)建有所不同, Example 本身提供了一個靜態(tài)方法 create(Object entity),
          即根據(jù)一個對象(實際使用中一般是映射到數(shù)據(jù)庫的對象)來創(chuàng)建。然后可以設(shè)置一些過濾條件:
          Example exampleUser =Example.create(u).ignoreCase() // 忽略大小寫
                                                .enableLike(MatchMode.ANYWHERE);
                     // 對 String 類型的屬性,無論在那里值在那里都匹配。相當(dāng)于 %value%
             5 Project 主要是讓 Criteria 能夠進(jìn)行報表查詢,并可以實現(xiàn)分組。 Project 主要有
          SimpleProjection 、 ProjectionList 和 Property 三個實現(xiàn)。其中 SimpleProjection 和
          ProjectionList 的實例化是由內(nèi)建的 Projections 來完成,如提供的 avg 、 count 、 max 、
          min 、 sum 可以讓開發(fā)者很容易對某個字段進(jìn)行統(tǒng)計查詢。
             6 Property 是對某個字段進(jìn)行查詢條件的設(shè)置,如通過Porperty.forName(“color”).in
          (new String[]{“black”,”red”,”write”}); 則可以創(chuàng)建一個 Project 實例。通過
          criteria 的 add(Project) 方法加入到查詢條件中去。
             使用 Criteria 進(jìn)行查詢,主要要清晰的是 Hibernate 提供了那些類和方法來滿足開發(fā)中查
          詢條件的創(chuàng)建和組裝,下面介紹幾種用法:
             1. 創(chuàng)建一個Criteria 實例
             org.hibernate.Criteria接口表示特定持久類的一個查詢。Session是 Criteria實例的工廠。
             Criteria crit = sess.createCriteria(Cat.class);
             crit.setMaxResults(50);
             List cats = crit.list();
           
             2. 限制結(jié)果集內(nèi)容
             一個單獨的查詢條件是org.hibernate.criterion.Criterion 接口的一個實例。
             org.hibernate.criterion.Restrictions類 定義了獲得某些內(nèi)置Criterion類型的工廠方法。

             List cats = sess.createCriteria(Cat.class)
                             .add( Restrictions.like("name", "Fritz%") )
                             .add( Restrictions.between("weight", minWeight, maxWeight) )
                             .list();

             約束可以按邏輯分組。

           

          List cats = sess.createCriteria(Cat.class)

              .add( Restrictions.like("name", "Fritz%") )

              .add( Restrictions.or(

                  Restrictions.eq( "age", new Integer(0) ),

                  Restrictions.isNull("age")

              ) )

              .list();

           

          List cats = sess.createCriteria(Cat.class)

              .add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )

              .add( Restrictions.disjunction()

                  .add( Restrictions.isNull("age") )

                  .add( Restrictions.eq("age", new Integer(0) ) )

                  .add( Restrictions.eq("age", new Integer(1) ) )

                  .add( Restrictions.eq("age", new Integer(2) ) )

              ) )

              .list();

           

          Hibernate提供了相當(dāng)多的內(nèi)置criterion類型(Restrictions 子類), 但是尤其有用的是可以允許

          你直接使用SQL。

           

          List cats = sess.createCriteria(Cat.class)

              .add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%",

          Hibernate.STRING) )

              .list();

           

          {alias}占位符應(yīng)當(dāng)被替換為被查詢實體的列別名。

          Property實例是獲得一個條件的另外一種途徑。你可以通過調(diào)用Property.forName() 創(chuàng)建一個

          Property。

           

            Property age = Property.forName("age");

          List cats = sess.createCriteria(Cat.class)

              .add( Restrictions.disjunction()

                  .add( age.isNull() )

                  .add( age.eq( new Integer(0) ) )

                  .add( age.eq( new Integer(1) ) )

                  .add( age.eq( new Integer(2) ) )

              ) )

              .add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) )

              .list();

           

          3. 結(jié)果集排序

          你可以使用org.hibernate.criterion.Order來為查詢結(jié)果排序。

           

          List cats = sess.createCriteria(Cat.class)

              .add( Restrictions.like("name", "F%")

              .addOrder( Order.asc("name") )

              .addOrder( Order.desc("age") )

              .setMaxResults(50)

              .list();

           

          List cats = sess.createCriteria(Cat.class)

              .add( Property.forName("name").like("F%") )

              .addOrder( Property.forName("name").asc() )

              .addOrder( Property.forName("age").desc() )

              .setMaxResults(50)

              .list();

           

          4. 關(guān)聯(lián)

          你可以使用createCriteria()非常容易的在互相關(guān)聯(lián)的實體間建立 約束。

           

          List cats = sess.createCriteria(Cat.class)

              .add( Restrictions.like("name", "F%")

              .createCriteria("kittens")

                  .add( Restrictions.like("name", "F%")

              .list();

           

          注意第二個 createCriteria()返回一個新的 Criteria實例,該實例引用kittens 集合中的元素。

          接下來,替換形態(tài)在某些情況下也是很有用的。

           

          List cats = sess.createCriteria(Cat.class)

              .createAlias("kittens", "kt")

              .createAlias("mate", "mt")

              .add( Restrictions.eqProperty("kt.name", "mt.name") )

              .list();

           

          (createAlias()并不創(chuàng)建一個新的 Criteria實例。)

          Cat實例所保存的之前兩次查詢所返回的kittens集合是 沒有被條件預(yù)過濾的。如果你希望只獲得

          符合條件的kittens, 你必須使用returnMaps()。

           

          List cats = sess.createCriteria(Cat.class)

              .createCriteria("kittens", "kt")

              .add( Restrictions.eq("name", "F%") )

              .returnMaps()

              .list();

          Iterator iter = cats.iterator();

          while ( iter.hasNext() ) {

              Map map = (Map) iter.next();

              Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);

              Cat kitten = (Cat) map.get("kt");

          }

          5. 動態(tài)關(guān)聯(lián)抓取

          你可以使用setFetchMode()在運行時定義動態(tài)關(guān)聯(lián)抓取的語義。

           

          List cats = sess.createCriteria(Cat.class)

              .add( Restrictions.like("name", "Fritz%") )

              .setFetchMode("mate", FetchMode.EAGER)

              .setFetchMode("kittens", FetchMode.EAGER)

              .list();

           

          這個查詢可以通過外連接抓取mate和kittens。

           

          6. 查詢示例

          org.hibernate.criterion.Example類允許你通過一個給定實例 構(gòu)建一個條件查詢。

           

          Cat cat = new Cat();

          cat.setSex('F');

          cat.setColor(Color.BLACK);

          List results = session.createCriteria(Cat.class)

              .add( Example.create(cat) )

              .list();

           

          版本屬性、標(biāo)識符和關(guān)聯(lián)被忽略。默認(rèn)情況下值為null的屬性將被排除。

          可以自行調(diào)整Example使之更實用。

           

          Example example = Example.create(cat)

              .excludeZeroes()           //exclude zero valued properties

              .excludeProperty("color")  //exclude the property named "color"

              .ignoreCase()              //perform case insensitive string comparisons

              .enableLike();             //use like for string comparisons

          List results = session.createCriteria(Cat.class)

              .add(example)

              .list();

           

          甚至可以使用examples在關(guān)聯(lián)對象上放置條件。

           

          List results = session.createCriteria(Cat.class)

              .add( Example.create(cat) )

              .createCriteria("mate")

                  .add( Example.create( cat.getMate() ) )

              .list();

           

          7. 投影(Projections)、聚合(aggregation)和分組(grouping)

          org.hibernate.criterion.Projections是 Projection 的實例工廠。我們通過調(diào)用

          setProjection()應(yīng)用投影到一個查詢。

           

          List results = session.createCriteria(Cat.class)

              .setProjection( Projections.rowCount() )

              .add( Restrictions.eq("color", Color.BLACK) )

              .list();

           

          List results = session.createCriteria(Cat.class)

              .setProjection( Projections.projectionList()

                  .add( Projections.rowCount() )

                  .add( Projections.avg("weight") )

                  .add( Projections.max("weight") )

                  .add( Projections.groupProperty("color") )

              )

              .list();

          

          在一個條件查詢中沒有必要顯式的使用 "group by" 。某些投影類型就是被定義為 分組投影,他

          們也出現(xiàn)在SQL的group by子句中。

          可以選擇把一個別名指派給一個投影,這樣可以使投影值被約束或排序所引用。下面是兩種不同的

          實現(xiàn)方式:

           

          List results = session.createCriteria(Cat.class)

              .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )

              .addOrder( Order.asc("colr") )

              .list();

           

          

          List results = session.createCriteria(Cat.class)

              .setProjection( Projections.groupProperty("color").as("colr") )

              .addOrder( Order.asc("colr") )

              .list();

           

          alias()和as()方法簡便的將一個投影實例包裝到另外一個 別名的Projection實例中。簡而言之,

          當(dāng)你添加一個投影到一個投影列表中時 你可以為它指定一個別名:

           

          List results = session.createCriteria(Cat.class)

              .setProjection( Projections.projectionList()

                  .add( Projections.rowCount(), "catCountByColor" )

                  .add( Projections.avg("weight"), "avgWeight" )

                  .add( Projections.max("weight"), "maxWeight" )

                  .add( Projections.groupProperty("color"), "color" )

              )

              .addOrder( Order.desc("catCountByColor") )

              .addOrder( Order.desc("avgWeight") )

              .list();

           

          List results = session.createCriteria(Domestic.class, "cat")

              .createAlias("kittens", "kit")

              .setProjection( Projections.projectionList()

                  .add( Projections.property("cat.name"), "catName" )

                  .add( Projections.property("kit.name"), "kitName" )

              )

              .addOrder( Order.asc("catName") )

              .addOrder( Order.asc("kitName") )

              .list();

           

          也可以使用Property.forName()來表示投影:

           

          List results = session.createCriteria(Cat.class)

              .setProjection( Property.forName("name") )

              .add( Property.forName("color").eq(Color.BLACK) )

              .list();

          List results = session.createCriteria(Cat.class)

              .setProjection( Projections.projectionList()

                  .add( Projections.rowCount().as("catCountByColor") )

                  .add( Property.forName("weight").avg().as("avgWeight") )

                  .add( Property.forName("weight").max().as("maxWeight") )

                  .add( Property.forName("color").group().as("color" )

              )

              .addOrder( Order.desc("catCountByColor") )

              .addOrder( Order.desc("avgWeight") )

              .list();

           

          8. 離線(detached)查詢和子查詢

             在web層,程序員使用DetachedCriteria來構(gòu)造查詢條件,然后將這個DetachedCriteria作為方法調(diào)用參數(shù)傳遞給業(yè)務(wù)層對象。而業(yè)務(wù)層對象獲得DetachedCriteria之后,可以在session范圍內(nèi)直接構(gòu)造Criteria,進(jìn)行查詢。就此,查詢語句的構(gòu)造完全被搬離到web層實現(xiàn),而業(yè)務(wù)層則只負(fù)責(zé)完成持久化和查詢的封裝即可,與查詢條件構(gòu)造完全解耦,非常完美!這恐怕也是以前很多企圖在web層代碼中構(gòu)造HQL語句的人想實現(xiàn)的夢想吧!

          DetachedCriteria類使你在一個session范圍之外創(chuàng)建一個查詢,并且可以使用任意的 Session來

          執(zhí)行它。

           

          DetachedCriteria query = DetachedCriteria.forClass(Cat.class)

              .add( Property.forName("sex").eq('F') );

          //創(chuàng)建一個Session

          Session session = .;

          Transaction txn = session.beginTransaction();

          List results = query.getExecutableCriteria(session).setMaxResults(100).list();

          txn.commit();

          session.close();

           

          DetachedCriteria也可以用以表示子查詢。條件實例包含子查詢可以通過 Subqueries或者

          Property獲得。

           

          DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)

              .setProjection( Property.forName("weight").avg() );

          session.createCriteria(Cat.class)

              .add( Property.forName("weight).gt(avgWeight) )

              .list();

          DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)

              .setProjection( Property.forName("weight") );

          session.createCriteria(Cat.class)

              .add( Subqueries.geAll("weight", weights) )

              .list();

          相互關(guān)聯(lián)的子查詢也是有可能的:

          DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2")

              .setProjection( Property.forName("weight").avg() )

              .add( Property.forName("cat2.sex").eqProperty("cat.sex") );

          session.createCriteria(Cat.class, "cat")

              .add( Property.forName("weight).gt(avgWeightForSex) )

              .list();


          例子
          public List findAllByCriter(final DetachedCriteria detachedCriteria){
           return (List)getHibernateTemplate().execute(new HibernateCallback(){
            public Object doInHibernate(Session session)
             throws HibernateException{
             Criteria criteria=detachedCriteria.getExecutableCriteria(session);
             return criteria.list();
            }
           });
          }

           

          本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/kjfcpua/archive/2009/06/21/4287248.aspx
          -----------------------------------------------------------------------------------------
          Hibernate一直都認(rèn)為比較簡單 就那么影射一下:)但最近項目當(dāng)中遇見很多問題,今天看見別人在項目當(dāng)中使用了 Hibernate3的DetachedCriteria,感覺真的是太好了,于是就花了點時間研究了一下,希望和大家分享一下吧
            針對這種需求,對于分層應(yīng)用程序來說,Web層需要傳遞一個查詢的條件列表給業(yè)務(wù)層對象,業(yè)務(wù)層對象獲得這個條件列表之后,然后依次取出條件,構(gòu)造查詢語句。這里的一個難點是條件列表用什么來構(gòu)造?傳統(tǒng)上使用Map,但是這種方式缺陷很大,Map可以傳遞的信息非常有限,只能傳遞name和 value,無法傳遞究竟要做怎樣的條件運算,究竟是大于,小于,like,還是其它的什么,業(yè)務(wù)層對象必須確切掌握每條entry的隱含條件。因此一旦隱含條件改變,業(yè)務(wù)層對象的查詢構(gòu)造算法必須相應(yīng)修改,但是這種查詢條件的改變是隱式約定的,而不是程序代碼約束的,因此非常容易出錯。

            DetachedCriteria可以解決這個問題,即在web層,程序員使用DetachedCriteria來構(gòu)造查詢條件,然后將這個 DetachedCriteria作為方法調(diào)用參數(shù)傳遞給業(yè)務(wù)層對象。而業(yè)務(wù)層對象獲得DetachedCriteria之后,可以在session范圍內(nèi)直接構(gòu)造Criteria,進(jìn)行查詢。就此,查詢語句的構(gòu)造完全被搬離到web層實現(xiàn),而業(yè)務(wù)層則只負(fù)責(zé)完成持久化和查詢的封裝即可,與查詢條件構(gòu)造完全解耦,非常完美!這恐怕也是以前很多企圖在web層代碼中構(gòu)造HQL語句的人想實現(xiàn)的夢想吧!

            示例代碼片段如下:

            web層程序構(gòu)造查詢條件:

            Java代碼:
          DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class);
          detachedCriteria.add(Restrictions.eq("name", "department")).createAlias("employees", "e").add(Restrictions.gt(("e.age"), new Integer(20)));

            Department和Employee是一對多關(guān)聯(lián),查詢條件為:

            名稱是“department”開發(fā)部門;
            部門里面的雇員年齡大于20歲;

            業(yè)務(wù)層對象使用該條件執(zhí)行查詢:

            java代碼: detachedCriteria.getExecutableCriteria(session).list();
            最大的意義在于,業(yè)務(wù)層代碼是固定不變的,所有查詢條件的構(gòu)造都在web層完成,業(yè)務(wù)層只負(fù)責(zé)在session內(nèi)執(zhí)行之。這樣代碼就可放之四海而皆準(zhǔn),都無須修改了。

            然而Spring和Hibernate3的DetachedCriteria有不兼容的問題,因此在Spring環(huán)境下面使用Hibernate3需要注意:

            Spring的HibernateTemplate提供了Hibernate的完美封裝,即通過匿名類實現(xiàn)回調(diào),來保證Session的自動資源管理和事務(wù)的管理。其中核心方法是:

            java代碼:
          HibernateTemplate.execute(new HibernateCallback() {
           public Object doInHibernate(Session session) throws HibernateException {
            ....
           }
          }
            回調(diào)方法提供了session作為參數(shù),有了session,就可以自由的使用Hibernate API編程了。使用了spring的之后,代碼修改如下:

            web層代碼:

            java代碼:
          DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class);
          detachedCriteria.createAlias("employees", "e").add(Restrictions.eq("name", "department")).add(Restrictions.gt(("e.age"), new Integer(20)));
          departmentManager.findByCriteria(detachedCriteria);
            構(gòu)造detachedCriteria,作為參數(shù)傳遞給departmentManager

            業(yè)務(wù)層代碼使用spring,DepartmentManager的findByCriteria如下:

            java代碼:

          public List findByCriteria(final DetachedCriteria detachedCriteria) {
           return (List) getHibernateTemplate().execute(new HibernateCallback() {
            public Object doInHibernate(Session session) throws HibernateException {
             Criteria criteria = detachedCriteria.getExecutableCriteria(session);
             return criteria.list();
            }
           });
          }
            實際上也就是:

            java代碼:
          Criteria criteria = detachedCriteria.getExecutableCriteria(session);
          return criteria.list();
            而已

            但是該程序代碼執(zhí)行,會拋出強制類型轉(zhuǎn)換異常!

            我跟蹤了一下spring和Hibernate源代碼,原因如下:

            spring的HibernateTemplate的execute方法提供的回調(diào)接口具有Session作為參數(shù),但是實際上,默認(rèn)情況下, HibernateTemplate傳遞給回調(diào)接口的session并不是org.hibernate.impl.SessionImpl類,而是 SessionImpl類的一個Proxy類。之所以替換成為一個Proxy類,HibernateTemplate的注釋說明,Proxy提供了一些額外的功能,包括自動設(shè)置Cachable,Transaction的超時時間,Session資源的更積極的關(guān)閉等等。

            java代碼:
          private boolean exposeNativeSession = false;
          ...
            execute方法內(nèi)部:
          Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session));

            但是遺憾的是,Hibernate的DetachedCriteria的setExecutableCriteria方法卻要求將session參數(shù)強制轉(zhuǎn)為SessionImpl,但是spring傳過來的卻是一個Proxy類,因此就報錯了。

            java代碼:
          public Criteria getExecutableCriteria(Session session) {
           impl.setSession( (SessionImpl) session ); // 要求SessionImpl,Spring傳遞的是Proxy
           return impl;
          }

            解決方法,禁止Spring的HibernateTemplate傳遞Proxy類,強制要求它傳遞真實的SessionImpl類,即給exexute方法增加一個參數(shù),提供參數(shù)為true,如下:

            java代碼:
          public List findByCriteria(final DetachedCriteria detachedCriteria) {
           return (List) getHibernateTemplate().execute(new HibernateCallback() {
            public Object doInHibernate(Session session) throws HibernateException {
             Criteria criteria = detachedCriteria.getExecutableCriteria(session);
             return criteria.list();
            }
           }, true);
          }

          posted @ 2009-11-03 17:41 junly 閱讀(1685) | 評論 (0)編輯 收藏

           


          文章來源:http://www.cnblogs.com/ycoe/archive/2006/09/28/516810.html
          posted @ 2009-11-03 17:35 junly 閱讀(106) | 評論 (0)編輯 收藏

          1 ,void delete ( Object entity ) : 刪除指定持久化實例
          public void removePerson( int personid)
          {
          //先加載特定的實例
          Object p = getHibernateTemplate().load( Person.class , new Integer( personid));
          //刪除特定實例
          getHibernateTemplate().delete (p);
          }
          2 ,deleteAll ( Collection entities ) : 刪除集合內(nèi)全部持久化類實例

          3 ,find ( String queryString ) : 根據(jù)HQL查詢字符串來返回實例集合
          Public List getPersons()
          {
          //返回Person的全部實例
          return getHibernateTemplate().find ( " from Person " );
          }

          4 ,findByNamedQuery ( String queryName) : 根據(jù)命名查詢返回實例集合

          5 ,get ( Class entityClass , Serializable id ) : 根據(jù)主鍵加載特定持久化類的實例
          public Person getPerson()
          {  
          //返回特定主鍵對應(yīng)的Person實例
          return (Person)getHibernateTemplate().get (Person.class , new Integer(person id));
          }
          6 ,save ( Object entity ) : 保存新的實例

          7 ,saveOrUpdate ( Object entity ): 根據(jù)實例狀態(tài),選擇保存或者更新

          8 ,update ( Object entity ) : 更新實例的狀態(tài),要求entity是持久狀態(tài)

          9 ,setMaxResults ( int maxResults ) : 設(shè)置分頁的大小。




          HibernateTemplate的 更靈活 的用法 :
          更靈活的訪問是通過以下兩個方法完成的:
          Object execute ( HibernateCallback action ) ;
          List execute ( HibernateCallback action );
          這兩個方法都需要一個HibernateCallback的實例,可以在任何有效的hibernate數(shù)據(jù)訪問中使用。用法靈活,解決了Spring封裝Hibernate后靈活性不足的缺陷。 HibernateCallback 是一個接,該接口只有一個方doInHibernate ( org.hibernate.Session session ), 該方法只有一個參數(shù)Session.
          public class PersonDaolmpl implements PersonDao
          {
          // 私有實例變量保存SessionFactory
          private SessionFactory sessionFactory;
          // 依賴注入必需的setter 方法
          public void setSessionFactory(SessionFactory sessionFactory)
          {
          this.sessionFactory = sessionFactory;
          }

          /**
          *通過人名查找所有匹配該名的Person 實例
          @param name 匹配的人名
          @return 匹配該任命的全部Person 集合
          */

          public List findPersonsByName(final String name)
          //創(chuàng)建HibernateTemplate實例
          HibernateTemplate hibernateTemplate = new HibernateTemplate(this.sessionFactory);
          //返回HibernateTemplate的execute 的結(jié)果
          return (List) hibernateTemplate.execute (
          //創(chuàng)建匿名內(nèi)部類
          new HibernateCallback ()
          public Object doInHibernate (Session session)
          throws Hibernate Exception
          {
          //使用條件查詢的方法返回
          List result = session.createCriteria(Person.class)
          .add(Restrictions.like(
          "name", name+ " %") .list ( ) ;
          return result;
          }
           ) :
          }

          }

          注意:在方法doInHibernate內(nèi)可以訪問到Session,該session是完全綁定到當(dāng)前線程的Session實例,保證在對于復(fù)雜的持久層訪問時,依然可以使用Hibernate的訪問方式。
          posted @ 2009-11-03 17:20 junly 閱讀(5345) | 評論 (3)編輯 收藏
          僅列出標(biāo)題
          共18頁: First 上一頁 9 10 11 12 13 14 15 16 17 下一頁 Last 
          主站蜘蛛池模板: 固安县| 莱西市| 苏尼特左旗| 肥乡县| 云浮市| 吉安县| 江川县| 汶川县| 承德市| 卢龙县| 桐乡市| 广汉市| 贺州市| 深水埗区| 蒙山县| 彭山县| 聂荣县| 牟定县| 高台县| 汉中市| 二手房| 碌曲县| 安国市| 阜宁县| 南投市| 奇台县| 邓州市| 永清县| 佛坪县| 肇庆市| 太仓市| 全南县| 尼木县| 额尔古纳市| 崇信县| 德昌县| 涞源县| 贡觉县| 木兰县| 西畴县| 宜川县|