程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 升級到Hibernate3.2之後的一些問題

升級到Hibernate3.2之後的一些問題

編輯:關於JAVA

1、從Hibernate3.0.x/3.1.x升級到最新的Hibernate3.2,一定要注意,Hibernate3.2的很多sql函數如count(), sum()的唯一返回值已經從Integer變為Long,如果不升級代碼,會得到一個ClassCastException.這個變化主要是為了兼容JPA,可以在Hibernate.org的最新文檔中找到說明。

Hibernate Team也提供了一個與原來兼容的解決方案:

Configuration classicCfg = new Configuration();
classicCfg.addSqlFunction( "count", new ClassicCountFunction());
classicCfg.addSqlFunction( "avg", new ClassicAvgFunction());
classicCfg.addSqlFunction( "sum", new ClassicSumFunction());
SessionFactory classicSf = classicCfg.buildSessionFactory();

int count = ((Integer)q.uniqueResult()).intValue();改成 int count = ((Number)q.uniqueResult()).intValue(); 這樣就可以兩個版本同時兼容。

2、Hibernate3.2要求ehcache1.2

3、session.createSQLQuery(sql).executeUpdate();這個Hibernate3.0.5不支持,而Hibernate3.2支持,session.createSQLQuery(fsql).addScalar("singlevalue",Hibernate.DOUBLE).uniqueResult();這個到了3.2就不需要addScalar了。

4、session.createSQLQuery(sql).addEntity(Class class);Hibernate3.0.5不支持,單個參數的addEntity方法。

5、Hibernate3.2可以對原生sql 查詢使用ResultTransformer.這會返回不受Hibernate管理的實體。

sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
.setResultTransformer(Transformers.aliasToBean(CatDTO.class))

或:

setResultTransformer(new AliasToBeanResultTransformer(CatDTO.class))

上面的查詢將會返回CatDTO的列表,它將被實例化並且將NAME和BIRTHDAY的值注射入對應的屬性或者字段。但必須注意,對每一個列都必須addScalar("列名")

6、setResultTransformer與addEntity的一個區別是前者支持查任意的列,後者必須用select * from users的形式或select {a.*},{b.*} from a,b where ……。

7,Map vs. Object[]

Since you can also use a transformer that return a Map from alias to value/entity

(e.g. Transformers.ALIAS_TO_MAP), you are no longer required to mess with index based

Object arrays when working with a result.

List iter = s.createQuery(
  "select e.student.name as studentName," +
  "       e.course.description as courseDescription" +
  "from   Enrolment as e")
  .setResultTransformer( Transformers.ALIAS_TO_MAP )
  .iterate();

String name = (Map)(iter.next()).get("studentName");

Again, this works equally well for Criteria, HQL and native SQL。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved