Вы можете использовать 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();
}
Вызывается ПЕРЕД выполнением ddl. И, кажется, нет хорошего способа адаптировать его, так как нет подходящего события, которое можно было бы использовать.
Взгляните на Запуск сценария 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 свойство.