TransWikia.com

Как получить граф сущностей удаляемых каскадом?

Stack Overflow на русском Asked by Sergey Gornostaev on November 5, 2021

Задумал я пользователю, удаляющему какую-либо сущность, показывать страничку подтверждения удаления, на которой будет отображаться иерархия всех удаляемых каскадом сущностей. Вроде такого:
введите сюда описание изображения
И уже начал прикидывать, как это лучше реализовать, но у меня возникло острое чувство велосипедостроения. Наверняка я не первый, кто такое делает. Уверен, даже не в первой тысяче. Вот только Google готовых решений мне не подсказал. Знает кто-нибудь об уже существующих способах решения этой задачи? Если таких нет, было бы интересно обсудить красивые и эффективные варианты.

3 Answers

если загрузить дерево через JPA EntityGraph не целесообразно (например потому что придется "вручную" задавать субструктуры, которые нас интересуют) то можно попробовать хакерский способ:

  1. конфигурация:
  • транзакции управляются программно (не контейнером)
  • установлен перехватчик события удаления, например PreDeleteEventListener (см. https://vladmihalcea.com/hibernate-event-listeners/)
  • или hibernate Interceptor (удобно унаследоваться от EmptyInterceptor)
  • альтернативно JPA/Hibernate перехватчикам, можно врезать перехватчик на уровне JDBC драйвера и отлавливать DELETE команды (но это на любителя (или "тру хакера", который пишет код на java исключительно через echo :) )); преимуществом такого способа будет надежность и универсальность, недостатком - отсутствие информации о сущностях, будут только таблицы.
  1. начать транзакцию
  2. выполнить удаление
  3. возможно придется вызвать flush()
  4. собрать список / дерево сущностей из событий полученных перехватчиком
  5. далее по ситуации
  • вариант А: откатить транзакцию и показать диалог
  • вариант Б: (если позволяют настройки БД) оставить транзакцию в подвешенном состоянии и закоммитить когда пользователь подтвердит удаление.

Answered by Ramiz on November 5, 2021

Вы можете нарисовать такую структуру используя Reflection API:

  1. взять сущность, получить список полей
  2. сделать поле доступным (на случай, если оно приватное)
  3. вернуть значение поля, а если это объект или массив, то провалится внутрь и начать с п.1

Возможно, алгоритм, изложенный в файле https://github.com/hawkab/redmine_integration/blob/master/src/main/java/ru/hawkab/redmineintegration/util/InterpolateUtil.java

в методе getMapByObject вам поможет в формировании целевой структуры.

Answered by hwak on November 5, 2021

Насчет готовых решений я не уверен, но однако ваша ситуация мне напомнила один маленький проект который я реализовал очень давно. Надо было рисовать иерархию файловой системы в виде дерево как у вас. Только я его делал на десктопном приложении. Вот пример кода:

package dir.hierarchy;

import java.io.File;
import java.io.IOException;

public class FileUtil {

    public static void main(String[] a) throws IOException {
        String path = "/opt/apache-maven-3.5.0";
        showDir(1, new File(path));
    }

    private static void showDir(int indent, File file) throws IOException {

        for (int i = 0; i < indent; i++)
            System.out.print('-');

        System.out.println(file.getName());

        if (file.isDirectory()) {
            File[] files = file.listFiles();
            if (files != null) {
                for (File file1 : files)
                    showDir(indent + 4, file1);
            }
        }
    }
}

Пример кода взят отсюда. Вот что он печатает.

-apache-maven-3.5.0
-----bin
---------m2.conf
---------mvn
---------mvn.cmd
---------mvnDebug
---------mvnDebug.cmd
---------mvnyjp
-----boot
---------plexus-classworlds-2.5.2.jar
-----conf
---------logging
-------------simplelogger.properties
---------settings.xml
---------toolchains.xml
-----lib
...

Тут точно такой же принцип, просто Вам надо будет заменить файловую систему на систему категорий. Вам надо будет создать таблицу категорий в БД, показывая отношения родитель-ребенок. Вообщем общая картинка выглядит так.

Answered by GardenMan on November 5, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP