14 / 14 / 0
Регистрация: 01.12.2017
Сообщений: 577

ManyToMany в Spring Boot (Rest API)

13.11.2021, 19:08. Показов 1801. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер, такой вопрос. Есть таблицы tag и image, тег и картинка соответственно. У одной картинки может быть много тегов, и у одного тега - много картинок, явная связь многие ко многим, для реализации которой создана таблица image_tag (со связными полями image_id, tag_id). При этом теги должны быть уникальны, поэтому все возможные теги заранее записаны в таблицу tag. Вопрос состоит в том как правильно это реализовать с программной точки зрения, чтоб при тестировании через Postman сделать корректный запрос, который при добавлении тега к картинке взял тег с БД и чтоб картинка сохранялась с тегами в принципе. Ниже привожу запрос и код. Спасибо за любую помощь.

Примерный POST-запрос в Postman
JSON
1
2
3
4
5
6
7
8
9
{
      "originalName": "skyscrape",
      "contentType": "png",
      "size": 143.22,
      "reference": "dufhdhdiewewewed",
      "creationDate": "{{currentDate}}",
      "isDeleted": false,
      //"tags": {[]} // здесь не могу понять как правильно задавать теги
}
Image.java
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
@Entity
@Table(name = "image")
@SQLDelete(sql = "UPDATE image SET is_deleted = true WHERE id = ?")
@Where(clause = "is_deleted = false")
public class Image {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private long id;
 
    @Column(name = "original_name")
    private String originalName;
 
    @Column(name = "content_type")
    private String contentType;
 
    @Column(name = "size")
    private float size;
 
    @Column(name = "reference")
    private String reference;
 
    @Column(name = "creation_date")
    private LocalDateTime creationDate;
 
    @Column(name = "update_date")
    private LocalDateTime updateDate;
 
    @Column(name = "is_deleted")
    private boolean isDeleted;
 
    @ManyToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "user_id")
    private User user;
 
    @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH})
    @JoinTable(name = "image_tag",
            joinColumns = @JoinColumn(name = "image_id"),
            inverseJoinColumns = @JoinColumn(name = "tag_id"))
    private List<Tag> tags;
 
    /*конструкторы, геттеры-сеттеры*/
}
Tag.java
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
@Entity
@Table(name = "tag")
@SQLDelete(sql = "UPDATE tag SET is_deleted = true WHERE id = ?")
@Where(clause = "is_deleted = false")
public class Tag {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
 
    @Column(name ="tag")
    private String tag;
 
    @Column(name = "creation_date")
    private LocalDateTime creationDate;
 
    @Column(name = "update_date")
    private LocalDateTime updateDate;
 
    @Column(name = "is_deleted")
    private boolean isDeleted;
 
    @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH})
    @JoinTable(name = "image_tag",
            joinColumns = @JoinColumn(name = "tag_id"),
            inverseJoinColumns = @JoinColumn(name = "image_id"))
    private List<Image> images;
 
    /*конструкторы, геттеры-сеттеры*/
}
ImageRestController.java
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
@RestController
@RequestMapping("/api/user")
public class ImageRestController {
    @Autowired
    private ImageService imageService;
 
    @GetMapping("/images")
    public List<Image> findAll() {
        return imageService.findAll();
    }
 
    @GetMapping("/images/{imageId}")
    public Image getImage(@PathVariable int imageId) {
        return imageService.findById(imageId);
    }
 
    @PostMapping("/images")
    public Image newImage(@RequestBody Image newImage) {
        newImage.setId(0);
 
        return imageService.save(newImage);
    }
 
    @PutMapping("/images")
    public Image updateImage(@RequestBody Image updatedImage) {
        return imageService.save(updatedImage);
    }
 
    @DeleteMapping("/images/{imageId}")
    public void deleteImage(@PathVariable int imageId) {
        imageService.deleteById(imageId);
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.11.2021, 19:08
Ответы с готовыми решениями:

Spring boot rest heroku
Добрый день. Я новичок и заранее извиняюсь, если вопрос покажется глупым В общем, я написал spring boot приложение с базой данных...

Spring Boot REST сервис
Создаю в учебных целях REST сервис и постоянно возникают различные вопросы, каждый раз создавать тему не хочется по этому буду спрашивать...

Относительный адрес REST Spring Boot
Здравствуйте! Подскажите, пожалуйста, как можно сделать так, чтобы мне не нужно было в конфигурацию микросервисов добавлять url сервера...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.11.2021, 19:08
Помогаю со студенческими работами здесь

API Яндекс карт и spring boot
Хочу разобраться как использовать api яндекс карт и spring boot, но пока даже карту отобразить не получается. Контроллер @Controller...

Content type 'multipart/form-data;boundary=----WebKitFormBoundary.' not supported Spring Rest API
-1 голос «против» избранное Отправляю такой запрос: $.ajax({ type: 'POST', cache: false, processData: false, ...

Реализация REST/API (JSON) в Spring Boot
Я создал проект на спринг буте, используя Ваадин фреймворк создал чат, где несколько людей могут переписываться в интерфейсе(в браузере)....

Результат связи ManyToMany в виде списка значений REST
Я хочу, чтобы связь многие ко многим выглядела просто как перечисление значений одного из атрибутов, но получаю перечисление объектов. ...

Project 'org.springframework.boot:spring-boot-starter-parent:2.3.2.RELEASE' not found
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; ...


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

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

Новые блоги и статьи
Реализация многопоточных сетевых серверов на Python
py-thonny 16.05.2025
Когда сталкиваешься с необходимостью писать высоконагруженные сетевые сервисы, выбор технологии имеет критическое значение. Python, со своей элегантностью и высоким уровнем абстракции, может. . .
C# и IoT: разработка Edge приложений с .NET и Azure IoT
UnmanagedCoder 16.05.2025
Мир меняется прямо на наших глазах, и интернет вещей (IoT) — один из главных катализаторов этих перемен. Если всего десять лет назад концепция "умных" устройств вызывала скептические улыбки, то. . .
Гибридные квантово-классические вычисления: Примеры оптимизации
EggHead 16.05.2025
Гибридные квантово-классические вычисления — это настоящий прорыв в подходах к решению сложнейших вычислительных задач. Представьте себе союз двух разных миров: классические компьютеры, с их. . .
Использование вебсокетов в приложениях Java с Netty
Javaican 16.05.2025
HTTP, краеугольный камень интернета, изначально был спроектирован для передачи гипертекста с минимальной интерактивностью. Его главный недостаток в контексте современных приложений — это. . .
Реализация операторов Kubernetes
Mr. Docker 16.05.2025
Концепция операторов Kubernetes зародилась в недрах компании CoreOS (позже купленной Red Hat), когда команда инженеров искала способ автоматизировать управление распределёнными базами данных в. . .
Отражение в C# и динамическое управление типами
stackOverflow 16.05.2025
Reflection API в . NET — это набор классов и интерфейсов в пространстве имён System. Reflection, который позволяет исследовать и манипулировать типами, методами, свойствами и другими элементами. . .
Настройка гиперпараметров с помощью Grid Search и Random Search в Python
AI_Generated 15.05.2025
В машинном обучении существует фундаментальное разделение между параметрами и гиперпараметрами моделей. Если параметры – это те величины, которые алгоритм "изучает" непосредственно из данных (веса. . .
Сериализация и десериализация данных на Python
py-thonny 15.05.2025
Сериализация — это своего рода "замораживание" объектов. Вы берёте живой, динамический объект из памяти и превращаете его в статичную строку или поток байтов. А десериализация выполняет обратный. . .
Чем асинхронная логика (схемотехника) лучше тактируемой, как я думаю, что помимо энергоэффективности - ещё и безопасность.
Hrethgir 14.05.2025
Помимо огромного плюса в энергоэффективности, асинхронная логика - тотальный контроль над каждым совершённым тактом, а значит - безусловная безопасность, где безконтрольно не совершится ни одного. . .
Многопоточные приложения на C++
bytestream 14.05.2025
C++ всегда был языком, тесно работающим с железом, и потому особеннно эффективным для многопоточного программирования. Стандарт C++11 произвёл революцию, добавив в язык нативную поддержку потоков,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru