簡體   English   中英

OSGi + Hibernate

[英]OSGi + Hibernate

而不是將數據庫操作分散在四個(osgi)包中,所有操作都略有不同。 我想創建一個負責所有持久性問題的(簡單)OSGi 包。 我覺得這並不像聽起來那么簡單,因為“每個包的唯一類加載器”的事情。 因此,如果有人知道此類問題的解決方案,我將不勝感激。

我可以想到兩種方法來解決類加載問題。

  • 您是綁定到特定的 OSGi 框架,還是希望盡可能保持兼容? 或者您可以使用 Equinox 進行實施嗎? 在 Equinox 中,您有一種稱為 Buddy Classloading 的機制。 此添加允許您增加不同 OSGi 捆綁包之間某些類的可見性。 如果您對此主題感興趣,我想向您介紹這兩篇文章:了解 Eclipse 插件如何與 OSGi一起工作, Eclipse - 兩個 VM(和許多類加載器)的故事
  • 如果您更喜歡保持 OSGi 實現獨立,那么您可能會考慮將您希望保留的類提取到一個單獨的包中,Hibernate-Bundle 和您的其他包都依賴於該包。 這樣,他們都可以訪問持久類的 class 定義。

(如果您使用的是 Hibernate 注解)

當 Hibernate 捆綁包被告知帶注釋的 class 時,保存所有實體 class 加載程序。

然后在構建你的 SessionFactory 之前做這樣的事情。

ClassLoad cl = Thread.currentThread().getContextClassLoader();
try {
 Thread.currentThread().setContextClassLoader(yourClassLoader);
 factory = cfg.buildSessionFactory(); 
}finally {
 Thread.currentThread().setContextClassLoader(cl);  // restore the original class loader
}

剛剛在 Bundle 類/api 中發現了一個有趣的方法。

public java.lang.Class loadClass(java.lang.String name) throws java.lang.ClassNotFoundException

這必須解決一些 class 加載程序問題?

我將建議遠離伙伴 class 加載,因為它特定於 Eclipse 的 Equinox 實現,在我看來,人們可以讓它工作,但他們不明白為什么,每個人最終都成為其他人的伙伴。 這使您無法正確理解 OSGi 類加載的工作原理以及您需要使用的模式(復合 class 加載器、上下文 class 加載、OSGi 服務......)。

如果你的持久化包提前知道它需要持久化什么類型,那么包可以導入包含你的域類的所有必需的包(Require-Bundle 是邪惡的)。

管理上下文 class 加載程序(如 Roger 的回復)可以幫助 Hibernate,盡管我建議使用 Spring dm 之類的東西來隱藏 OSGi 服務后面。

Hibernate確實支持 OSGi ,但這是一項持續的努力

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM