2013-03-12 111 views
4

我在使用Spring多年後目前正在遷移到EJB3.1。我想在EJB中實現的一件事是,我無法找到匹配的模式,這是我的MigrationManager。 在Spring中,我有一個處理數據庫模式和數據遷移的bean。爲此,我實現了Spring BeanFactoryPostProcessor,因爲這樣我注入了數據庫連接,但JPA系統尚未初始化。所以我可以執行所有遷移步驟,然後完成應用程序的開始。在EJB3.1中執行初始化代碼

我怎麼可以做這樣的事情在EJB3.1(使用CDI ...如果這是很重要的)

克里斯

+0

也許可以在一個單獨的應用程序中執行@ Singleton + @ Startup datamigration-ejb,該應用程序在您的真實應用程序之前以嚴格的順序進行部署。但我真的沒有這方面的經驗。 – 2013-03-12 09:58:50

+0

但是必須有其他解決方案......我敢打賭,更多的人需要在啓動JPA實體管理器之前更新數據庫模式。最終是否有我可以使用的任何Hibernate初始化功能?否則,至少我有一個很酷的你不能用EJB做的例子;-) – 2013-03-12 10:43:30

回答

0

這是運行從EJB一些初始化代碼的方式:

@Singleton 
@Startup 
public class MigrationManager { 
    @PostConstruct 
    public void migrate() { 
     // do work 
    } 
} 

你不需要一個單獨的應用程序(如上面的評論中所建議的)。

EntityManagers懶得實例化,所以只要你不注入EntityManager到其他啓動代碼,這應該讓你有機會在EntityManager實際到達數據庫之前更新你的數據庫模式。

順便說一句,對於數據庫模式遷移,我建議Liquibase,它可以由ServletContextListener觸發。

+0

實際上,我爲Spring創建的MigrationManager實際上使用了Liquibase,但是允許將一個遷移步驟定義爲一個schma和數據序列遷移。模式遷移通過liquibase完成,數據遷移通過實現特殊界面的Java類完成。但是,感謝指針...我已經準備好了那個PostConstruct的事情,但我想我無法阻止任何其他Startup組件訪問EntityManager。我正在考慮修飾器並裝飾實體管理器幷包裝實體管理器的一些init方法。 – 2013-03-14 15:21:00