2013-04-03 3 views
0

Свойство Hibernate - hibernate.hbm2ddl.import_files - будет запущено только тогда, когда установлен - hibernate.hbm2ddl.auto.Создание данных вставки Hibernate при запуске системы

Есть ли какая-либо реализация, чтобы «изменить» это?

Не так, как ведет себя hibernate.hbm2ddl.import_files ... но способ спящего режима вставить некоторые данные после запуска системы (даже если таблицы созданы). Выполнение чистого сценария SQL не соответствует моим потребностям, потому что @Id @GeneratedValue не будет соблюдаться.

В конце концов, мне нужно, чтобы система обнаружила, что некоторые данные присутствуют в базе данных, а если нет, заполните ее им. Известно ли это делать и уважать счетчик @GeneratedValue?

ответ

2

В дополнение к правильному ответу, предложенному elias, вы также можете добавить ServletContextListener, так как это, вероятно, более четкий способ достижения вашей функциональности. Для этого вам необходимо реализовать интерфейс ServletContextListener и аннотировать класс с помощью @WebListener или объявить его в вашем web.xml.

public class MyServletContextListener implements ServletContextListener { 

@Override 
public void contextInitialized(ServletContextEvent sce) { 
    initializeDatabase(); 
} 

@Override 
public void contextDestroyed(ServletContextEvent sce) { } 

} 

Тогда вы должны либо добавить объявление в вашем web.xml:

<listener> 
    <listener-class>yourpackage.MyServletContextListener</listener-class> 
</listener> 

или, если вы в настоящее время на Servlet 3.0, просто аннотировать класс с @WebListener.

+0

+1 это действительно чище! :) – elias

+0

@elias В то же время я уже поддержал ваш ответ, поскольку он определенно намного умнее :) Кроме того, я действительно был удивлен, насколько может показаться сложной известная ситуация! – skuntsel

+0

правый! Я должен знать API лучше. :) Когда я использовал этот трюк, я думаю, что мне действительно нужен компонент с областью приложения, потому что он также установил несколько свойств с сообщениями, которые позже отображались в представлениях - так что это было удобно. – elias

2

Вы можете просто создать управляемый bean-компонент @ApplicationScoped, который вызывает метод, который вставляет данные в базу данных.

@ManagedBean(eager = true) 
@ApplicationScoped 
public class App { 

    @PostConstruct 
    public void init() { 
     myDAO.initDatabaseIfNeeded(); 
    } 
} 

Метод myDao.initDatabaseIfNeeded() вызывается при инициализации приложения и после того, как все зависимости будут решены - таким образом, после того, как все таблицы были созданы Hibernate уже.

Я недавно сделал аналогичную вещь в приложении Spring, поэтому в моем случае myDAO был на самом деле весенним сервисом.

Смежные вопросы