Выполнить сценарий sql после того, как jpa / EclipseLink создал таблицы?

Вы можете использовать ScriptEngine:

ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
String foo = "( (21 + 3) / 4 ) ";
try {
    System.out.println(engine.eval(foo));
} catch (ScriptException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
13
задан Pascal Thivent 29 April 2010 в 03:54
поделиться

2 ответа

Вызывается ПЕРЕД выполнением ddl. И, кажется, нет хорошего способа адаптировать его, так как нет подходящего события, которое можно было бы использовать.

0
ответ дан 1 December 2019 в 19:39
поделиться

Взгляните на Запуск сценария SQL при запуске в EclipseLink , который описывает решение, представленное как своего рода эквивалент Hibernate ] import.sql функция 1 .Благодарности Шону Смиту:

Запуск сценария SQL при запуске в EclipseLink

Иногда при работе с генерацией DDL полезно сначала запустить сценарий для очистки базы данных. В Hibernate, если вы поместите файл с именем "import.sql" в путь к классам, его содержимое будет отправлено в базу данных. Лично я не поклонник волшебных имен файлов, но это может быть полезной функцией .

В EclipseLink нет встроенной поддержки этого , но это легко сделать благодаря высокой расширяемости EclipseLink. Вот быстрое решение , которое я придумал: я просто регистрирую прослушиватель событий для сеанса события postLogin, а в обработчике я читаю файл и отправляю каждый оператор SQL для базы данных - красиво и чисто. Я пошел немного дальше и поддержал установку имени файла в качестве свойства единицы сохранения состояния. Вы можете указать все это в коде или в файле persistence.xml.

Класс ImportSQL настроен как SessionCustomizer с помощью свойства единицы сохранения состояния , которое на postLogin , читает файл , идентифицированный свойством "import.sql.file" . Это свойство также задано как свойство единицы сохранения состояния , которое передается в createEntityManagerFactory . Этот пример также показывает, как вы можете определить и использовать свои собственные свойства единицы сохранения состояния .

 import org.eclipse.persistence.config.SessionCustomizer; 
импортировать org.eclipse.persistence.sessions.Session; 
импортировать org.eclipse.persistence.sessions.SessionEvent; {{1} } import org.eclipse.persistence.sessions.SessionEventAdapter; 
импортировать org.eclipse.persistence.sessions.UnitOfWork; 
 
открытый класс ImportSQL реализует SessionCustomizer {
 
private void importSql (UnitOfWork unitOfWork, String fileName) {
 // Открыть файл {{ 1}} // Выполняем каждую строку, например, 
 // unitOfWork.executeNonSelectingSQL ("выберите 1 из двойного"); 
} 
 
 @Override {{ 1}} public void customize (сеанс сеанса) выдает исключение {
session.getEventManager (). AddListener (new SessionEventAdapter () {
 @Override 
public void postLogin (событие SessionEvent) {
String fileName = (String) event.getSession (). GetProperty ("import.sql.file"); 
UnitOfWork unitOfWork = event.getSession (). CollectUnitOfWork (); {{1 }} importSql (unitOfWork, fileName); 
unitOfWork.commit () 
} 
}); 
} 
 

 public static void main (String [] args) {
Map  properties = new HashMap  (); 
 
 // Включить генерацию DDL {{1} } properties.put (PersistenceUnitProperties.DDL_GENERATION, PersistenceUnitProperties.DROP_AND_CREATE); 
prop erties.put (PersistenceUnitProperties.DDL_GENERATION_MODE, PersistenceUnitProperties.DDL_DATABASE_GENERATION); 
 // Настроить настройщик сеанса, который будет передавать файл sql в базу данных до запуска генерации DDL 
properties.put (PersistenceUnit_CUSTER_CUSTION, модель. ImportSQL "); 
properties.put (" import.sql.file "," / tmp / someddl.sql "); 
 
EntityManagerFactory emf = Persistence 
 .createEntityManagerFactory ("employee", properties); 
} 
 

Я не уверен, что это строгий эквивалент, я не уверен, что скрипт запустится после создания базы данных. Требуется тестирование. Если нет, возможно, его можно будет адаптировать.

1 В Hibernate есть небольшая аккуратная функция, которая в значительной степени недостаточно документирована и неизвестна.Вы можете выполнить сценарий SQL во время создания SessionFactory сразу после создания схемы базы данных, чтобы импортировать данные в новую базу данных. Вам просто нужно добавить файл с именем import.sql в корневой каталог пути к классам и установить либо create, либо create-drop в качестве спящего режима.hbm2ddl.auto свойство.

16
ответ дан 1 December 2019 в 19:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: