簡體   English   中英

在OSGI和Hibernate中使用Liquibase

[英]Using Liquibase with OSGI and Hibernate

我想將一個Liquibase集成到我的項目中。 我的第一個想法是使用一個藍圖bean,它通過onInit方法啟動Liquibase更新。 但是休眠狀態存在問題,因為我們將“ hbm2ddl.auto”設置為“ validate”,並且在我的bean的onInit之前執行了驗證。 (我們在META-INF中將容器管理的持久性與persistence.xml一起使用)。 因此,我的第二個嘗試是使用BundleTracker,並且在清單中存在某些條目時,liquibase會執行db update。 它運行良好,但是如果數據庫更新失敗,我將強制執行該捆綁包。 但是我不知道如何從BundleTracker方法addBundle中做到這一點。 有什么方法可以防止從BundleTracker事件啟動捆綁包?

我有另一個可能的想法,可以執行此操作來創建執行更新的附加捆綁包,而其他具有persistence.xml的捆綁包將依賴於此捆綁包。 但是我們有很多與persistence.xml捆綁在一起的東西,這就是為什么BundleTracker解決方案對我來說似乎更好的原因。

在幾乎所有情況下,此類依賴項都應建模為服務。 啟動/停止捆綁包聽起來很容易,但隨着時間的流逝,它會讓您陷入可怕的可吸入泥潭。

一旦動態依賴項成為服務,OSGi中的所有部分(尤其是聲明性服務)就使其在動態處理方面變得微不足道。 不僅在“快樂”的情況下,而且在很多方面,這些事情都可能導致錯誤。

因此,在您的情況下,您將創建一個LiquibaseHappy服務或其他東西,並且使用db的捆綁軟件應依賴於它。

您也許可以使用最新的pax-jdbc-config來完成此任務。 它從配置中提供數據源服務。 因此,它本身已經是有用的抽象。

現在,最新版本包含一個稱為PreHook的功能。 基本上,您實現的OSGi服務實現了PreHook接口 ,並使用name屬性發布它。 然后,在您的DataSource配置中,您可以通過名稱來引用該服務。 創建數據源后,將在發布數據源以供其他捆綁軟件使用之前調用此服務。 因此,在PreHook中,您可以使用liquibase處理數據庫,並且基於hibernate的捆綁軟件僅在數據庫處於新狀態時才能看到DataSource。

有關示例,請參見PreHook集成測試

暫無
暫無

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

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