自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

討論Hibernate和模型對象

開發(fā) 后端
這里介紹Hibernate和模型對象,OpenCore數(shù)據(jù)層實現(xiàn)OSGi上集成Hibernate,Hibernate及其依賴庫作為一個單獨的插件,這樣帶來一個問題。

學(xué)習(xí)Hibernate時,經(jīng)常會遇到一些小問題,這里將介OSGi平臺的插件類加載機(jī)制使得Hibernate無法正確加載分布在不同插件內(nèi)部的模型對象與O/R映射文件問題的解決方法。

OpenCore是在OSGi規(guī)范上構(gòu)建的微內(nèi)核(Microkenerl),基于純組件(Pure Plugin)開放源碼企業(yè)應(yīng)用軟件平臺。

OpenCore數(shù)據(jù)層實現(xiàn)OSGi上集成Hibernate,Hibernate及其依賴庫作為一個單獨的插件,這樣帶來一個問題,就是OSGi平臺的插件類加載機(jī)制使得Hibernate無法正確加載分布在不同插件內(nèi)部的模型對象與O/R映射文件。本文討論解決方案:

模型對象(Domain Objects)插件

模型對象(Domain Objects)集中到獨立的插件(Bundle)內(nèi),Hibernate插件依賴這些模型對象插件。這是最簡單的,也是比較糟糕的方式,比較小的基于OSGi的項目可以這也作做。

Eclipse-BuddyPolicy與Eclipse-RegisterBuddy方式

Equinox(Eclipse提供的OSGi實現(xiàn))平臺特有的方式,允許插件(Bundle)聲明自己的伙伴,讓“伙伴插件”來動態(tài)加載本插件的類,這也是Hiberate與Equinox集成的官方解決方案。這種方式模型對象無需部署在單獨的插件內(nèi),與業(yè)務(wù)插件部署在一起即可,Hibernate插件也無須依賴模型對象。

具體做法如下:

首先,Hibernate插件(名稱,例如org.opengoss.orm.hibernate)聲明自身可以作為伙伴插件,自描述文件(MANIFEST.MF) 加入描述:Eclipse-BuddyPolicy: registered

然后,模型對象的業(yè)務(wù)插件中把Hibernate插件加入為伙伴,自描述文件(MANIFEST.MF) 加入描述:Eclipse-RegisterBuddy:org.opengoss.orm.hibernate

Eclipse Extension Point方式

這是我們目前實現(xiàn)的方式,通過標(biāo)準(zhǔn)的Eclipse擴(kuò)展點與擴(kuò)展機(jī)制,我們在Hibernate插件中plugin.xml配置文件中聲明下述擴(kuò)展點,在模型對象插件中聲明擴(kuò)展,例如:

Hibernate插件的啟動中,用代碼配置生成SessionFactory,代碼如下: 

  1. public void start(BundleContext context) throws Exception {   
  2. Configuration configuration = new Configuration().configure
    (new File ("./etc/org.opengoss.database.hibernate/hibernate.cfg.xml"));   
  3. Class[] domainClasses = getDomainClasses();   
  4. for (Class domainClass : domainClasses) {   
  5. configuration.addClass(domainClass);   
  6. }   
  7. sessionFactory = configuration.buildSessionFactory();   
  8. Dictionarynew Hashtable props.put("scope", "APPLICATION");   
  9. props.put("uid", "Hibernate:SessionFactory");   
  10. registration = context.registerService
    (SessionFactory.class.getName(), sessionFactory, props);  
  11. }   
  12. private Class[] getDomainClasses() throws Exception {   
  13. List domainClasses = new ArrayList();   
  14. IExtensionPoint point = registry.getExtensionPoint
    (IConstants.DOMAIN_OBJECT_EXTENSION_POINT);   
  15. IExtension[] extensions = point.getExtensions();   
  16. for (IExtension extension : extensions) {  
  17. IConfigurationElement[] elements = extension.getConfigurationElements();   
  18. for (IConfigurationElement configurationElement : elements) {   
  19. Bundle bundle = pluginContext.getBundleBySymbolId
    (extension.getNamespaceIdentifier());   
  20. Class domainClass = bundle.loadClass
    (configurationElement.getAttribute("class"));   
  21. domainClasses.add(domainClass);   
  22. }   
  23. }   
  24. return domainClasses.toArray(new Class[domainClasses.size()]);   
  25. }  

注意:Hibernate內(nèi)部的類加載機(jī)制實在無法令人滿意,盡管我們在這種方式中已經(jīng)加載所有的模型類對象,但Hibernate內(nèi)部仍然會調(diào)用Class.forName()去試圖加載。

【編輯推薦】

  1. Hibernate可行性全面概括
  2. Hibernate Sequence基礎(chǔ)描述
  3. 淺析Hibernate使用EhCache
  4. Hibernate的一級Cache
  5. Hibernate update淺談
責(zé)任編輯:佚名 來源: IT168
相關(guān)推薦

2009-09-22 15:33:34

Hibernate U

2009-09-24 09:52:20

Spring Hibe

2012-05-30 15:03:43

ibmdw

2012-02-08 14:24:35

HibernateJava

2012-02-01 09:21:23

Hadoop分布式文件系統(tǒng)OpenStack

2009-09-25 13:14:58

Hibernate C

2009-09-29 10:46:58

Hibernate領(lǐng)域

2009-09-23 10:14:10

Hibernate使用

2023-05-31 08:41:23

分層架構(gòu)對象模型

2009-09-23 13:26:10

Hibernate對象

2009-09-25 14:41:15

Hibernate對象

2012-02-08 12:17:38

HibernateJava

2009-09-29 16:11:45

Hibernate實現(xiàn)

2009-09-24 15:42:44

Hibernate對象

2009-09-23 10:41:10

對象標(biāo)識符Hibernate

2009-09-25 10:38:42

Hibernate動態(tài)

2009-06-18 13:29:05

Hibernate下載Hibernate安裝

2009-06-26 16:31:50

區(qū)分不同對象Hibernate

2012-02-08 14:01:18

HibernateJava

2009-06-17 15:06:50

Hibernate實體
點贊
收藏

51CTO技術(shù)棧公眾號