2013-03-12 75 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