0 / 0 / 0
Регистрация: 17.03.2023
Сообщений: 3
1

Проверка связи между сущностями

17.03.2023, 17:43. Показов 951. Ответов 5

Author24 — интернет-сервис помощи студентам
Всем привет. Я недавно начала изучать БД, вот возник вопрос с отношениями между таблицами.

Есть несколько таблиц, которые связаны между собой отношениями. Когда я начала писать рест-контроллер с методом @DeleteMapping, мне сказали проверить наличие связи между сущностями, в случае наличия-выкинуть исключение, в случае отсутствия - удалить объект.

Немного не понимаю, как реализовать проверку. Спасибо за помощь)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2023, 17:43
Ответы с готовыми решениями:

Связи между сущностями, вывод таблиц, Derby
Здравствуйте. У меня тут при "ознакомлении" с Derby в NetBeans возникла проблема. Создала 4...

Проверка связи с сокетом
Можно ли стандартными средствами проверить, есть ли доступ к сокету? Если я например, сервер...

Организовать связи между сущностями
Добрый день. Помогите, пожалуйста, правильно организовать связь между сущностями. Строго...

Тип связи между сущностями
Здравствуйте! начинаю осваивать БД, помогите разобраться на примере базы данных банка. Данные о...

5
98 / 75 / 25
Регистрация: 17.03.2023
Сообщений: 161
20.03.2023, 12:55 2
по идеи и так должно выскочить исключение если связь существует. ДБ система не должна позволить удалить сущность если имеется связь. Однако это зависит ещё от конфигурации ДБ, но она должна соответствовать требованиям. Дайте больше информации, вы чем пользуетесь? хайбернет? спринг? поделитесь кодом вашего контроллера.
0
0 / 0 / 0
Регистрация: 17.03.2023
Сообщений: 3
22.03.2023, 12:02  [ТС] 3
Использую Spring. Уточнили задание: написать запрос, который будет смотреть есть ли в базе связь c ProductionStudioMoive.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class PerformanceController {
 
    private final PerformanceService performanceService;
 
    public PerformanceController(PerformanceService performanceService) {
        this.performanceService = performanceService;
    }
 
 
    @DeleteMapping("/performance/{id}")
    public ResponseEntity<PerformanceResponsDto> deletePerformance(@PathVariable Long id) {
 
        //вот тут должен быть запрос
        performanceService.deleteById(id);
        return new ResponseEntity<>(HttpStatus.OK);
    }
}
Добавлено через 24 минуты
IOException, спасибо за ответ, выше немного поправила вопрос
0
98 / 75 / 25
Регистрация: 17.03.2023
Сообщений: 161
22.03.2023, 13:00 4
можно конечно если угодно провести проверку, однако довольно странно делать это на уровне контроллера. Если уже то на уровне performanceService в методе deleteById. Как я полагаю performanceService загружает объект по его id и потом уже на полученном объекте запускает метод object.delete(). Можно перед этим проверить если у данного объекта связь с чем то например
Java
1
2
OtherObject otherObject = object.getOtherObject();
if (otherObject != null) throw new SomeException();
однако в этом на самом деле нет целесообразности. Если такая связь существует, уже на уровне базы данных это не получится сделать. База данных не позволит удалить объект который ещё связан с другим. Кроме если намеренно настроить констрайнты так чтобы она позволяла это делать. Но если ей это позволить, то это делается только в таких сценариях где проверять наличие связи не имело бы смысла. Если же нельзя убирать объект пока существую связи, как в вашем случае, то база данных и так не позволит его убрать. Уже на уровне хайбернета будет сброшена ConstraintViolationException. Это исключение будет пробиваться вплоть до вашего контроллера и дальше. Попробуйте удалить связанный объект вашим контроллером, могу поспорить вы увидите ConstraintViolationException.

вам следует её ловить в контроллере и в случае если она появилась генерировать не HTTP.OK а ошибочный вариант например HTTP.BadRequest (статус 400)

Добавлено через 12 минут
а ещё лучше написать компонент @EventListener нежели вы пользуетесь спрингом

Добавлено через 18 минут
ээ сорри не @EventListener а @ExceptionHandler
вам сюда
компонент аннотированный @ControllerAdvice позволяет ловить и обрабатывать исключения где бы они не возникали. Таким образом вам не понадобится обрабатывать ConstraintViolationException исключения в контроллерах.
1
0 / 0 / 0
Регистрация: 17.03.2023
Сообщений: 3
22.03.2023, 13:11  [ТС] 5
IOException, да, глобальный обработчик исключений создан. Но в данной задаче требуют именно такого алгоритма(
__

Добавлено через 3 минуты
IOException

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
@Entity
@Table(name = "production_studios_movies")
@Getter
@Setter
public class ProductionStudiosMovie {
 
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;
 
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "performance_id", nullable = false)
    public StudiosPerformance studiosPerformance;
 
    public ProductionStudiosMovie() {
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
        ProductionStudiosMovie that = (ProductionStudiosMovie) o;
        return id != null && Objects.equals(id, that.id);
    }
 
    @Override
    public int hashCode() {
        return getClass().hashCode();
    }
}
}
 
@Entity
@Table(name = "studios_performance")
@Getter
@Setter
@ToString
public class StudiosPerformance {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;
 
    @Column(name = "name")
    private String name;
 
    public StudiosPerformance() {
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
        StudiosPerformance that = (StudiosPerformance) o;
        return id != null && Objects.equals(id, that.id);
    }
 
    @Override
    public int hashCode() {
        return getClass().hashCode();
    }
}
Добавлено через 34 секунды
IOException, я немного не понимаю, как в вашем примере, мне вытащить объект
0
98 / 75 / 25
Регистрация: 17.03.2023
Сообщений: 161
22.03.2023, 14:16 6
Лучший ответ Сообщение было отмечено Aksiniya15 как решение

Решение

А!

У вас получается отношение между этими сущностями является однонаправленным. То есть вы можете извлечь 1 объект StudiosPerformance из объекта ProductionStudiosMovie. Однако обратную связь вы не реализовали. То есть не можете извлечь все объекты ProductionStudiosMovie связанные с конкретным объектом StudioPerformance.

то есть если вы хотите убрать конкретный объект сущности StudioPerformance и проверить существуют ли объекты сущности ProductionStudiosMovie привязанные к объекту который вы хотите удалить, у вас нет простой возможности их получить.

для решение этой проблемы у вас два варианта.

1. либо вы делаете запрос по таблице production_studios_movies с условием WHERE performance_id IS ...
если результат не пустой (количество найденных объектов >0) значит такие объекты существуют и вы можете кидать исключение.

2. либо, как я бы посоветовал, дополнительно реализуйте обратную связь, то есть сделайте отношение двунаправленным.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
@Entity
@Table(name = "studios_performance")
@Getter
@Setter
@ToString
public class StudiosPerformance {
    //...
    
    @OneToMany(mappedBy="studiosPerformance")
    public Set<ProductionStudiosMovie> movies;
    //...
 
}
таким образом если у вас в руках объект сущности StudioPerformance, вы можете проверить прямо на нем, существуют ли связанные movies так

performance.getMovies()

таким образом реализовать проверку

if (performance.getMovies().size()>0) throw ...

здесь подробней
1
22.03.2023, 14:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.03.2023, 14:16
Помогаю со студенческими работами здесь

Определить ключи и связи между сущностями
Здравствуйте! Дана схема По этой схеме выписать ключи и связи между между сущностями. Вот что у...

Настроить связи между сущностями (Symfony2)
Добрый день. Возникла следующая задача. есть три сущности 1. Hotel(Отель) 2....

Работа в ERwin, связи между сущностями
Для создания приложения базы данных &quot;Альпинистский клуб&quot; необходимо на начальной стадии создать...

Создать правильные связи между сущностями
Разработать базу данных учета поставок товаров торговой компанией. Инициализация проекта: 1. База...

Как создать две связи один ко многим между сущностями?
Добрый день. Я пытаюсь создать две связи между сущностями, работает только одна из них. Есть две...

Проверка правильности между сущностями
Создание базы данных торговой сети. Правильна ли установлена связь между сущностями, может что-то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru