[英]OSGi + Hibernate
而不是將數據庫操作分散在四個(osgi)包中,所有操作都略有不同。 我想創建一個負責所有持久性問題的(簡單)OSGi 包。 我覺得這並不像聽起來那么簡單,因為“每個包的唯一類加載器”的事情。 因此,如果有人知道此類問題的解決方案,我將不勝感激。
我可以想到兩種方法來解決類加載問題。
(如果您使用的是 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 服務后面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.