Как заполнить Java (сеть) приложение с исходными данными с помощью Spring/JPA/Hibernate

Чистый / прямой подход должен выглядеть примерно так:

SELECT Client, Option, GROUP_CONCAT(Dish SEPARATOR ', ')
FROM table_name
GROUP BY Client, Option

Затем, когда ваши данные уже сгруппированы и склеены, просто напечатайте свои строки в одном цикле набора результатов.

Использование do {} while () здесь бесполезно.

Вот непроверенный фрагмент ...

if ($conmenu) {
    echo '';
        echo '';
        while ($row = mysqli_fetch_assoc($conmenu)) {
            echo '';
        }
    echo '
ClientOptionDishes
' , implode('', $row) , '
'; }

Для записи:

Максимально допустимая длина результата в байтах для функции GROUP_CONCAT (). По умолчанию установлено значение 1024.

blockquote>

https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_group_concat_max_len

Также [116 ] является итеративным, поэтому вы можете использовать foreach вместо цикла while.

foreach ($conmenu as $row) { ...

Если вы хотите сделать это трудным путем ...

SELECT Client, Option, Dish
FROM table_name
ORDER BY Client, Option

Тогда ... (не проверено)

if ($conmenu) {
    echo '';
        echo '';

        $group = null;
        foreach ($conmenu as $row) {
            if ($group !== $row['Client'] . '_' . $row['Option']) {
                if ($group !== null) {
                    echo '';
                }
                echo '';  // close final iteration
    echo '
ClientOptionDishes
' , implode('', $row); } else { echo ", " , $row['Dish']; } $group = $row['Client'] . '_' . $row['Option']; // update group } echo '
'; }

17
задан Community 23 May 2017 в 10:29
поделиться

7 ответов

Вы можете написать модульный тест для заполнения базы данных, используя JPA и простую Java. Этот тест будет вызван Maven как часть стандартного жизненного цикла сборки. В результате вы получите полностью инициализированную базу данных, используя Maven, JPA и Java в соответствии с запросом.

5
ответ дан 30 November 2019 в 14:21
поделиться

Я хотел бы использовать для этого синглтон-бин:

import javax.annotation.PostConstruct;
import javax.ejb.Startup;
import javax.ejb.Singleton;

@Singleton
@Startup
public class InitData {

    @PostConstruct
    public void load() {
        // Load your data here.
    }

}
2
ответ дан 30 November 2019 в 14:21
поделиться

Зависит от вашей БД. Лучше иметь сценарий для настройки db

1
ответ дан 30 November 2019 в 14:21
поделиться

Вы можете создавать объекты JPA в чистом классе Java и сохранять их. Этот класс может вызываться сервлетом, но также иметь метод main и вызываться из командной строки с помощью maven (с помощью подключаемого модуля Exec Maven) или даже в виде оболочки как подключаемый модуль Maven.

Но ваш финальный рабочий процесс не ясен (вы хотите, чтобы инициализация была частью запуска приложения или выполнялась во время сборки?) И требует некоторых пояснений.

2
ответ дан 30 November 2019 в 14:21
поделиться

Я не уверен, что вы сможете отказаться от использования некоторого SQL. Это будет зависеть от того, работают ли ваши разработчики с пустой базой данных без определенной схемы или таблицы есть, но они пусты.

Если вы начинаете с пустых таблиц, вы можете использовать подход Java для генерации данных. Я не так хорошо знаком с Maven, но предполагаю, что вы можете создать некоторую задачу, которая будет использовать ваши классы DAO для генерации данных. Вы, вероятно, даже могли бы написать его, используя язык сценариев на основе JVM, такой как Groovy, который мог бы напрямую использовать ваши классы DAO. У вас будет аналогичная задача, которая очистит данные из таблиц. Тогда ваши разработчики просто запустят эти задачи в командной строке или в своей среде IDE в качестве ручного шага после оформления заказа.

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

0
ответ дан 30 November 2019 в 14:21
поделиться

Обычный способ сделать это - использовать сценарий SQL. Затем вы запускаете специальный файл bash, который заполняет базу данных с помощью вашего .sql
Если вы хотите иметь возможность программно настроить свою базу данных во время запуска WebApp, вы можете использовать прослушиватель веб-контекста .
Во время инициализации вашего веб-контекста вы можете использовать прослушиватель контекста сервлета, чтобы получить доступ к вашему DAO (уровень сервиса ... что угодно), создать ваши сущности и сохранить их, как вы это делаете в своем java-коде

p.s. в качестве справки Жизненный цикл сервлета

Если вы используете Spring, вам следует взглянуть на раздел справочника Стандартные и настраиваемые события . Это лучший способ реализовать Spring Listener, который знает о контексте Spring (в случае, если вам нужно получить из него свои службы)

2
ответ дан 30 November 2019 в 14:21
поделиться
  1. В вышеупомянутый ServletContextListener или в общее место запуска поместите весь предстоящий код
  2. Определите ваши данные в приемлемом формате - XML, JSON или даже java-сериализация.
  3. Проверьте, существуют ли исходные данные (или флаг, указывающий на успешный начальный импорт)
  4. Если они существуют, пропустите. Если не существует, получить новый DAO (используя WebApplicationContextUtils.getRequiredWebApplicationContext().getBean(...)), перебрать все предопределенные объекты и персистировать их через EntityManager в базу данных.
1
ответ дан 30 November 2019 в 14:21
поделиться
Другие вопросы по тегам:

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