Выполнить код инициализации в EJB3.1

В настоящее время я перехожу на EJB3.1 после многолетнего использования Spring. Одна вещь, которую я хотел бы реализовать в EJB, для которой я пока не смог найти подходящий шаблон, — это мой MigrationManager. Весной у меня был bean-компонент, который занимался схемой базы данных и миграцией данных. Для этого я реализовал Spring BeanFactoryPostProcessor, потому что таким образом у меня было введено соединение с базой данных, но система JPA еще не инициализирована. Таким образом, я мог выполнить все шаги миграции, а затем завершить запуск приложения.

Как я могу сделать что-то подобное в EJB3.1 (используя CDI... если это важно)

Крис


person Christofer Dutz    schedule 12.03.2013    source источник
comment
Возможно, можно сделать @Singleton+@Startup datamigration-ejb в отдельном приложении, которое развертывается в строгом порядке перед вашим реальным приложением. Но у меня действительно нет опыта в этом.   -  person Aksel Willgert    schedule 12.03.2013
comment
Но должно быть какое-то другое решение... Бьюсь об заклад, у большего количества людей есть требование обновить схему БД перед запуском JPA Entity Manager. В конце концов, есть ли какая-либо функция инициализации Hibernate, которую я мог бы использовать? В противном случае, по крайней мере, у меня есть хороший пример чего-то классного, что вы не можете сделать с EJB ;-)   -  person Christofer Dutz    schedule 12.03.2013


Ответы (1)


Вот как можно запустить некоторый код инициализации из EJB:

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

Для этого вам не нужно отдельное приложение (как было предложено в комментарии выше).

EntityManagers создаются лениво, поэтому, пока вы не вводите EntityManager в какой-либо другой код запуска, это должно дать вам возможность обновить схему вашей базы данных до того, как EntityManager действительно попадет в базу данных.

Кстати, для переноса схемы базы данных я бы рекомендовал Liquibase, который может быть запущен с помощью ServletContextListener.

person Harald Wellmann    schedule 12.03.2013
comment
Что ж, на самом деле MigrationManager, который я создал для Spring, на самом деле работает с использованием Liquibase, но позволяет определить один шаг миграции как последовательность миграции schma и данных. Миграция схемы выполняется через Liquibase, а миграция данных — через классы Java, реализующие специальный интерфейс. Но спасибо за указатель ... Я уже думал об этой вещи PostConstruct, но я думаю, что не мог предотвратить доступ любого другого компонента запуска к EntityManager. Я думал о декораторе, украшал диспетчер сущностей и обертывал какой-то метод инициализации менеджера сущностей. - person Christofer Dutz; 14.03.2013