Взгляните на Запуск сценария SQL при запуске в EclipseLink , который описывает решение, представленное как своего рода эквивалент import.sql
функции Hibernate 1 . Кредиты Шон Смит:
Иногда при работе с DDL
поколение полезно запустить скрипт
сначала очистить базу данных. В
Hibernate, если вы положили файл с именем
"import.sql" на вашем пути к классам его
содержимое будет отправлено в базу данных.
Лично я не фанат магии
имена файлов, но это может быть полезным
особенность.
Там нет встроенной поддержки для этого
в EclipseLink, но это легко сделать
спасибо EclipseLink's высоко
расширяемость. Вот быстрое решение
Я придумал: я просто регистрирую
прослушиватель событий для сеанса
событие postLogin и в обработчике I
прочитать файл и отправить каждый SQL
постановка в базу данных - красиво и
чистый. Я пошел немного дальше и
поддерживается настройка имени файла
как свойство единицы сохраняемости. Вы
можете указать все это в коде или в
persistence.xml.
Класс ImportSQL
настроен как
SessionCustomizer
через
свойство единицы сохраняемости, которое на
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);
}
Хотя я не уверен, что это строгий эквивалент, я не уверен, что скрипт будет запущен после генерации базы данных. Требуется тестирование. Если это не так, может быть, это можно адаптировать.
1 Hibernate имеет изящную небольшую функцию, которая сильно недокументирована и неизвестна. Вы можете выполнить сценарий SQL во время создания SessionFactory сразу после создания схемы базы данных, чтобы импортировать данные в новую базу данных. Вам просто нужно добавить файл с именем import.sql в корневой каталог classpath и установить либо create, либо create-drop в качестве свойства hibernate.hbm2ddl.auto.