#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
полученное в качестве параметра пути.