2009-06-26 72 views
4

我的應用程序中有不同插件的命名完全相同,我希望能夠使用Hibernate正確配置它們。問題是,看起來Hibernate在嘗試查找類時會動態生成一個類的包名稱。通過一個插件,該方案可以工作,但是跨多個插件無法使用。看起來Hibernate在跨多個插件處理Hibernate配置文件時會感到困惑。在動態Eclipse插件中使用Hibernate

這是因爲每個插件都有自己的類加載器嗎?繼續使用現有插件和Hibernate進行工作的最佳方式是什麼?

回答

4

問題是,每個插件都有自己的Classloader,而Hibernate使用Reflection來查找正確的類。

我在家裏有一篇關於這個問題的非常好的文章,但是這篇文章是德文的。我會盡力解釋你需要做什麼。

爲了讓數據結構在多個插件上共享,您必須將其放入插件並啓用名爲buddy-policy的功能。 假設你有一個在啓動時啓動休眠的主應用程序插件,這個插件需要從數據結構插件中「查看」類。要做到這一點主插件設置其好友策略爲「註冊」,並且數據結構插件註冊爲「好友」。不幸的是,你必須直接在清單文件中完成這些工作,至少在3.3版本中,編輯器中沒有辦法做到這一點。

一旦這個好友策略工作,Hibernate也會。

我擡頭看看我的舊應用程序,這裏是我如何做到的。

  1. 主要的應用程序(toolseye.rcp)依賴於休眠插件(de.eye4eye.hibernate)和數據結構,插件(toolseye.datastructures)
  2. 的休眠-插件指定其夥伴的策略爲 「註冊」
  3. 本身的數據結構,插件的寄存器到休眠-插件

以下是重要的行:

休眠-插件de.eye4eye.hibernate

Eclipse-BuddyPolicy: registered 

數據結構網絡化,插件toolseye.datastructures

Eclipse-RegisterBuddy: de.eye4eye.hibernate 

直接把那些線在MANIFEST.MF

兩個插件需要重新導出它們的軟件包,以便在主應用程序或任何你層有在之間可以使用它們。 希望有所幫助。

+0

非常有幫助,非常感謝! – AlbertoPL 2009-07-03 05:45:51

1

只是爲了使這個完整。

EclipseLink可以用作Eclipse RCP應用程序中的JPA提供程序,而不是使用Hibernate。 EclipseLink是Oracle的前TopLink,並被選爲JPA 2的參考實現。

RCP的一點是,EclipseLink可用作OSGI-Bundles(org.eclipse.persistence.jpa),並且由於它可以從另一個插件加載類而不需要額外的夥伴策略。

目前我正在玩耍,使用以下項目結構(模型 - 視圖 - 演示者模式)。在括號中的名字指定的關係是不插件(不是所有的都包括在內,只涉及到這個問題的)

  • rcp.mvp.view(rcp.mvp.presenter/ rcp.mvp.model)
  • rcp.mvp.presenter(rcp.mvp.data - 數據的重導出模型,所以這是 這裏不需要)*
  • rcp.mvp.data(rcp.mvp.data.mysql/ rcp.mvp.model/javax.persistence/ org.eclipse.persistence.jpa)
  • rcp.mvp.data.mysql - 僅提供 mysql-jdbc-driver。必須是 類路徑內
  • rcp.mvp.model

在這種情況下,在數據的插件JPA提供能夠加載從模型插件類沒有夥伴-政策。

*注意,因爲這是由DAO的封裝(主要的原因仍然使用它們)

鏈接