Ответ 1
Он называется ПРЕЖДЕ ЧЕМ ddl-исполнение. И, кажется, нет хорошего способа адаптировать его, так как нет подходящего события, которое можно было бы использовать.
есть ли возможность выполнить sql script, после того, как EclipseLink сгенерировал ddl?
Другими словами, возможно ли, что свойство EclipseLink "eclipselink.ddl-generation" с "drop-and-create-tables" используется, а EclipseLink выполняет другой sql файл (чтобы вставить некоторые данные в некоторые только что созданные таблицы) после создания определение таблицы?
Я использую EclipseLink 2.x и JPA 2.0 с GlassFish v3.
Или можно инициализировать таблицы в java-методе, который вызывается при развертывании проекта (война с ejb3)?
Он называется ПРЕЖДЕ ЧЕМ ddl-исполнение. И, кажется, нет хорошего способа адаптировать его, так как нет подходящего события, которое можно было бы использовать.
Я столкнулся с этим вопросом по тем же причинам, пытаясь найти подход для запуска инициализации script после генерации DDL. Я предлагаю этот ответ на старый вопрос в надежде сократить количество "литературных исследований" для тех, кто ищет такое же решение.
Я использую GlassFish 4 с его реализацией по умолчанию EclipseLink 2.5 JPA по умолчанию. Новая функция генерации схемы в JPA 2.1 позволяет довольно просто указать "инициализацию" script после завершения генерации DDL.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="cbesDatabase" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>java:app/jdbc/cbesPool</jta-data-source>
<properties>
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
<property name="javax.persistence.schema-generation.create-source" value="metadata"/>
<property name="javax.persistence.schema-generation.drop-source" value="metadata"/>
<property name="javax.persistence.sql-load-script-source" value="META-INF/sql/load_script.sql"/>
<property name="eclipselink.logging.level" value="FINE"/>
</properties>
</persistence-unit>
</persistence>
Вышеприведенная конфигурация генерирует сценарии DDL из метаданных (т.е. аннотации), после чего запускается META-INF/sql/load_script.sql
script для заполнения базы данных. В моем случае я забираю несколько таблиц с тестовыми данными и генерирую дополнительные представления.
Дополнительную информацию об использовании свойств JPA в EclipseLink можно найти в разделе "Генерация DDL" EclipseLink/Release/2.5/JPA21. Аналогично, Раздел 37.5 Создание схемы базы данных в учебнике Oracle Java EE 7 и TOTD # 187 предлагают быстрое введение также.
Посмотрите Запуск SQL Script при запуске в EclipseLink, в котором описывается решение, представленное как эквивалент Hibernate import.sql
функция 1. Кредиты Шон Смит:
Запуск SQL Script при запуске в EclipseLink
Иногда при работе с DDL генерации полезно использовать scriptсначала очистить базу данных. В Спящий режим, если вы поместите файл с именем "import.sql" в вашем классе содержимое будет отправлено в базу данных. Лично я не поклонник магии имена файлов, но это может быть полезно особенность.
Там нет встроенной поддержки для этого в EclipseLink, но это легко сделать благодаря EclipseLink высоко расширяемость. Здесь быстрое решение Я придумал: я просто регистрирую прослушиватель событий для сеанса postLogin и в обработчике я прочитать файл и отправить каждый SQL выражение в базу данных - приятно и чистый. Я пошел немного дальше и поддерживается установка имени файла как свойство единицы непрерывности. Вы может указывать все это в коде или в persistence.xml.
Класс
ImportSQL
настроен как aSessionCustomizer
через свойство единицы персистентности, которое на событиеpostLogin
, читает файл идентифицированный "import.sql.file", имущество. Это свойство также указанный как единица персистентности имущество, которое передаетсяcreateEntityManagerFactory
. Эта пример также показывает, как вы можете определить и используйте свой собственный блок персистентности свойства.import org.eclipse.persistence.config.SessionCustomizer; import org.eclipse.persistence.sessions.Session; import org.eclipse.persistence.sessions.SessionEvent; import org.eclipse.persistence.sessions.SessionEventAdapter; import org.eclipse.persistence.sessions.UnitOfWork; public class ImportSQL implements SessionCustomizer { private void importSql(UnitOfWork unitOfWork, String fileName) { // Open file // Execute each line, e.g., // unitOfWork.executeNonSelectingSQL("select 1 from dual"); } @Override public void customize(Session session) throws Exception { session.getEventManager().addListener(new SessionEventAdapter() { @Override public void postLogin(SessionEvent event) { String fileName = (String) event.getSession().getProperty("import.sql.file"); UnitOfWork unitOfWork = event.getSession().acquireUnitOfWork(); importSql(unitOfWork, fileName); unitOfWork.commit() } }); }
public static void main(String[] args) { Map<String, Object> properties = new HashMap<String, Object>(); // Enable DDL Generation properties.put(PersistenceUnitProperties.DDL_GENERATION, PersistenceUnitProperties.DROP_AND_CREATE); properties.put(PersistenceUnitProperties.DDL_GENERATION_MODE, PersistenceUnitProperties.DDL_DATABASE_GENERATION); // Configure Session Customizer which will pipe sql file to db before DDL Generation runs properties.put(PersistenceUnitProperties.SESSION_CUSTOMIZER, "model.ImportSQL"); properties.put("import.sql.file","/tmp/someddl.sql"); EntityManagerFactory emf = Persistence .createEntityManagerFactory("employee", properties); }
Я не уверен, что это строгий эквивалент, но я не уверен, что Script будет запущен после генерации базы данных. Требуется тестирование. Если это не так, возможно, оно может быть адаптировано.
1 Спящий режим имеет аккуратную небольшую функцию, которая сильно недооценена и неизвестна. Вы можете выполнить SQL Script во время создания SessionFactory сразу после генерации схемы базы данных для импорта данных в новую базу данных. Вам просто нужно добавить файл с именем import.sql в свой корневой каталог пути и установить либо create, либо create-drop как свойство hibernate.hbm2ddl.auto.
Это может помочь, поскольку здесь возникает путаница: Используйте только тот же набор свойств (кроме регистратора) для посева данных.
НЕ ИСПОЛЬЗУЙТЕ:
<property name="eclipselink.ddl-generation" value="create-tables"/>
<property name="eclipselink.ddl-generation.output-mode" value="database"/>
ИСПОЛЬЗУЙТЕ:
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
<property name="javax.persistence.schema-generation.create-source" value="metadata"/>
<property name="javax.persistence.schema-generation.drop-source" value="metadata"/>
Я подтверждаю, что это сработало для меня.
Этот процесс предлагает выполнение sql перед статусами DDL, тогда как то, что было бы неплохо (например, вставить данные семени), должно иметь то, что выполняется после операторов DDL. Я не хочу, если мне что-то не хватает. Может кто-нибудь, пожалуйста, скажите мне, как выполнить sql. AFTER eclipselink создал таблицы (когда свойство create-tables установлено в tru)
:) Просто подставьте свои данные
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
<property name="javax.persistence.schema-generation.create-source" value="metadata-then-script"/>
<property name="javax.persistence.sql-load-script-source" value="META-INF/seed.sql"/>