Как обновить таблицы со связью «многие ко многим» при выполнении операций crud в весенней загрузке

#database #spring-boot #controller #many-to-many #crud

Вопрос:

Я пытаюсь создать серверную часть Spring Boot для своего проекта. В базе данных у меня есть Deck и Word таблицы с отношениями «многие ко многим», подключенные через DeckWord таблицу. Таблица моста содержит дополнительные поля и составной PK, состоящий из PK других 2 таблиц.

Я не уверен в том, как мне следует структурировать операции crud в моем проекте. Допустим, я пытаюсь добавить новое слово, и оно должно быть отнесено к определенной колоде. Какой контроллер модели должен обрабатывать post операцию в этом сценарии: Word или DeckWord ? Должны Deck List<DeckWord> ли они также быть обновлены?

Обновить:

Включил модели, опустил геттеры, сеттеры и конструкторы

 @Entity
@Table(name = "deck")

    public class Deck {
        @Id
        @SequenceGenerator(
                name = "deck_sequence",
                sequenceName = "deck_sequence",
                allocationSize = 1
        )
        @GeneratedValue(
                strategy = GenerationType.SEQUENCE,
                generator = "deck_sequence"
        )
        @Column(name = "deck_id")
        private Long id;
        @Transient
        private Boolean learnt;
        private String name;
    
    
        @OneToMany(mappedBy = "deck", cascade = CascadeType.ALL)
        private List<DeckWord> deckwords;
    
        @ManyToOne
        @JoinColumn(name="appuser_id",referencedColumnName="appuser_id")
        private Appuser appuser;
    }
 

и

 @Entity
@Table(name = "word")

    public class Word {
        @Id
        @SequenceGenerator(
                name = "word_sequence",
                sequenceName = "word_sequence",
                allocationSize = 1
        )
        @GeneratedValue(
                strategy = GenerationType.SEQUENCE,
                generator = "word_sequence"
        )
        @Column(name = "word_id")
        private Long id;
        private String definition;
        private String transcription;
    
    
        @OneToMany(mappedBy = "word", cascade = CascadeType.ALL)
        private List<DeckWord> deckwords;
    }
 

и стол для бриджа:

 @Embeddable
class DeckWordKey implements Serializable {

    @Column(name = "deck_id")
    Long deckId;

    @Column(name = "word_id")
    Long wordId;
}


@Entity
@Table
public class DeckWord {
    @EmbeddedId
    DeckWordKey id;

    @ManyToOne
    @MapsId("deckId")
    @JoinColumn(name = "deck_id",referencedColumnName="deck_id")
    Deck deck;

    @ManyToOne
    @MapsId("wordId")
    @JoinColumn(name = "word_id",referencedColumnName="word_id")
    Word word;

    private Boolean learnt;
    private LocalDate last_checked;
    private WordGroup wordGroup;
}
 

Комментарии:

1. Post Живут ли они сами по себе или всегда должны быть связаны с собой User ? Кроме того, не могли бы вы добавить код ваших организаций? Спасибо!

2. Привет, я обновил вопрос и названия моделей. В этой базе данных слово всегда должно быть присвоено колоде

Ответ №1:

Отвечаю на ваши вопросы:

Какой контроллер модели должен обрабатывать операцию post в этом сценарии: Word или DeckWord?

Учитывая , что a Word всегда должно быть присвоено a Deck , я бы использовал запрос POST на URL «/decks/{deckId}/слова» для создания нового Word . Тело запроса должно включать definition и transcription .

Следует ли также обновить список колод?

Да, так и должно быть. Для этого вам нужно использовать deckId полученное в качестве параметра пути.