您好,登錄后才能下訂單哦!
這篇文章主要講解了“Hibernate和模型對象怎么理解”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Hibernate和模型對象怎么理解”吧!
學習Hibernate時,經常會遇到一些小問題,這里將介OSGi平臺的插件類加載機制使得Hibernate無法正確加載分布在不同插件內部的模型對象與O/R映射文件問題的解決方法。
OpenCore是在OSGi規范上構建的微內核(Microkenerl),基于純組件(Pure Plugin)開放源碼企業應用軟件平臺。
OpenCore數據層實現OSGi上集成Hibernate,Hibernate及其依賴庫作為一個單獨的插件,這樣帶來一個問題,就是OSGi平臺的插件類加載機制使得Hibernate無法正確加載分布在不同插件內部的模型對象與O/R映射文件。本文討論解決方案:
模型對象(Domain Objects)插件
模型對象(Domain Objects)集中到獨立的插件(Bundle)內,Hibernate插件依賴這些模型對象插件。這是最簡單的,也是比較糟糕的方式,比較小的基于OSGi的項目可以這也作做。
Eclipse-BuddyPolicy與Eclipse-RegisterBuddy方式
Equinox(Eclipse提供的OSGi實現)平臺特有的方式,允許插件(Bundle)聲明自己的伙伴,讓“伙伴插件”來動態加載本插件的類,這也是Hiberate與Equinox集成的官方解決方案。這種方式模型對象無需部署在單獨的插件內,與業務插件部署在一起即可,Hibernate插件也無須依賴模型對象。
具體做法如下:
首先,Hibernate插件(名稱,例如org.opengoss.orm.hibernate)聲明自身可以作為伙伴插件,自描述文件(MANIFEST.MF) 加入描述:Eclipse-BuddyPolicy: registered
然后,模型對象的業務插件中把Hibernate插件加入為伙伴,自描述文件(MANIFEST.MF) 加入描述:Eclipse-RegisterBuddy:org.opengoss.orm.hibernate
Eclipse Extension Point方式
這是我們目前實現的方式,通過標準的Eclipse擴展點與擴展機制,我們在Hibernate插件中plugin.xml配置文件中聲明下述擴展點,在模型對象插件中聲明擴展,例如:
Hibernate插件的啟動中,用代碼配置生成SessionFactory,代碼如下:
public void start(BundleContext context) throws Exception {
Configuration configuration = new Configuration().configure
(new File ("./etc/org.opengoss.database.hibernate/hibernate.cfg.xml"));Class[] domainClasses = getDomainClasses();
for (Class domainClass : domainClasses) {
configuration.addClass(domainClass);
}
sessionFactory = configuration.buildSessionFactory();
Dictionarynew Hashtable props.put("scope", "APPLICATION");
props.put("uid", "Hibernate:SessionFactory");
registration = context.registerService
(SessionFactory.class.getName(), sessionFactory, props);}
private Class[] getDomainClasses() throws Exception {
List domainClasses = new ArrayList();
IExtensionPoint point = registry.getExtensionPoint
(IConstants.DOMAIN_OBJECT_EXTENSION_POINT);IExtension[] extensions = point.getExtensions();
for (IExtension extension : extensions) {
IConfigurationElement[] elements = extension.getConfigurationElements();
for (IConfigurationElement configurationElement : elements) {
Bundle bundle = pluginContext.getBundleBySymbolId
(extension.getNamespaceIdentifier());Class domainClass = bundle.loadClass
(configurationElement.getAttribute("class"));domainClasses.add(domainClass);
}
}
return domainClasses.toArray(new Class[domainClasses.size()]);
}
注意:Hibernate內部的類加載機制實在無法令人滿意,盡管我們在這種方式中已經加載所有的模型類對象,但Hibernate內部仍然會調用Class.forName()去試圖加載。
感謝各位的閱讀,以上就是“Hibernate和模型對象怎么理解”的內容了,經過本文的學習后,相信大家對Hibernate和模型對象怎么理解這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。