全面概括Hibernate Annotations
本文向大家介紹Hibernate Annotations,可能好多人還不了解Hibernate Annotations,沒有關(guān)系,看完本文你肯定有不少收獲,希望本文能教會你更多東西。
在這篇文章中我們就來討論一下 hbm.xml 與 Hibernate Annotations的優(yōu)缺點,看看那種情況最適合你.
首先,討論一下 xml 配置文件的優(yōu)點,個人認為主要優(yōu)點就是當你改變底層配置時 不需要改變和重新編譯代碼,只需要在xml 中更改就可以了,例如 Hibernate.cfg.xml 當你要更改底層數(shù)據(jù)庫時,只要更改配置文件就可以了.Hibernate會為你做好別的事情.
那么xml的缺點呢,個人認為有以下幾點:
◆描述符多,不容易記憶,掌握 要深入了解還有看DTD文件
◆無法做自動校驗,需要人工查找
◆讀取和解析xml配置要消耗一定時間,導致應(yīng)用啟動慢,不便于測試和維護
◆當系統(tǒng)很大時,大量的xml文件難以管理
◆運行中保存xml配置需要消耗額外的內(nèi)存
◆在O/R Mapping的時候需要在java文件和xml配置文件之間交替,增大了工作量
其中第一 二點 借助于先進的IDE 可能不是什么問題. 但是對初學者還是個問題
下面我們看看 Hibernate Annotations的特性吧! 可以解決xml遇到的問題,有以下優(yōu)點
◆描述符減少。以前在xml配置中往往需要描述java屬性的類型,關(guān)系等等。而元數(shù)據(jù)本身就是java語言,從而省略了大量的描述符
◆編譯期校驗。錯誤的批注在編譯期間就會報錯。
◆元數(shù)據(jù)批注在java代碼中,避免了額外的文件維護工作
◆元數(shù)據(jù)被編譯成java bytecode,消耗的內(nèi)存少,讀取也很快,利于測試和維護
關(guān)于映射文件是使用 hbm.xml 文件還是使用 Hibernate Annotations 我們來看看2者的性能吧. 先聲明一下,個人認為映射文件一旦配置好就不會在很大程度上改變了.所以使用xml文件并不會帶來很大的好處.如果你認為映射文件在你的項目中也經(jīng)常變化,比如一列String數(shù)據(jù),今天你使用 length="16" 明天你認為該數(shù)據(jù)的長度應(yīng)該更長才能滿足業(yè)務(wù)需求 于是改為length="128" 等等類似的問題 . 如果你經(jīng)常有這方面的變動的話,下面的比較你可以不用看了,你應(yīng)該使用 xml文件 因為Hibernate Annotations 無法很好的滿足你的要求.
現(xiàn)在讓我們就來看看2者的性能比較吧.(說明: 這里只是比較查找 插入 的時間快慢,沒有比較除運行時間以外的其他性能,如 內(nèi)存占用量 等等)
先來看看測試程序和配置.首先在 Hibernate.cfg.xml 文件中去掉了
- <property name="hibernate.hbm2ddl.auto">update</property>
這一行, 因為在前面的實驗中以及建立了數(shù)據(jù)庫表了 不再需要更新了.如果你是第一次運行該例子 還是要該行的.
- /*
- * Created on 2005
- * @author
- */
- package test.hibernate.annotation;
- import org.hibernate.Session;
- import org.hibernate.Transaction;
- public class Test {
- public static void main(String [] args) {
- long start = 0;
- long end = 0;
- start = System.currentTimeMillis();//程序開始時間
- Session s = HibernateUtil.currentSession();
- long mid =System.currentTimeMillis();
- //初始化完畢的時間
- Transaction tx = s.beginTransaction();
- //測試讀取的代碼
- Person p = null;
- for(int i = 1; i <= 100; i ++) {
- p = (Person) s.get(Person.class, i);
- System.out.println(p.getName());
- }
- System.out.println(p.getName());
- //測試讀取1次的代碼
- Person p = null;
- p = (Person) s.get(Person.class, 1);
- System.out.println(p.getName());
- //測試插入的代碼
- /*
- for (int i = 0; i < 100; i ++) {
- Person p = new Person();
- p.setAge(i+1);
- p.setName("icerain"+i);
- p.setSex("male"+i);
- s.save(p);
- s.flush();
- }
- */
- tx.commit();
- HibernateUtil.closeSession();
- end = System.currentTimeMillis(); //測試結(jié)束時間
- System.out.println("String[] - start time: " + start);
- System.out.println("String[] - end time: " + end);
- System.out.println("Init time : " + (mid-start));
- // 打印初始化用的時間
- System.out.println("Last time is :" +(end - mid) );
- //打印 數(shù)據(jù)操作的時間
- System.out.println("Total time : " +(end - start));
- //打印總時間
- }
- }
【編輯推薦】