Добавьте ManyToMany с Spring MVC, JPA и Hibernate - PullRequest
0 голосов
/ 24 сентября 2019

В моем проекте Spring MVC я создал два класса, которые связаны как ManyToMany следующим образом:

Пользователи ( Id , баланс, фамилия и имя) -> Аренда ( UserID , MovieID ) <- Фильм (<strong> Id , название, режиссер и длина)

Читая о том, как это сделать, я закончилс этим кодом для обоих классов:

@Entity
@Table(name = "users")
public class Users implements Serializable {

@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name = "Rentals",
           joinColumns = { @JoinColumn(name = "user_id") },
           inverseJoinColumns = { @JoinColumn(name = "movie_id") } )
private Set<Movies> movies = new HashSet<>();

//--------------------------

@Entity
@Table(name = "movies")
public class Movies implements Serializable {

@ManyToMany(fetch = FetchType.LAZY, 
            cascade = { CascadeType.PERSIST, CascadeType.MERGE }, 
            mappedBy = "movies")
private Set<Users> users = new HashSet<>();

Не только это, но я добавил hibernate.ddl-auto = create и hibernate.hbm2ddl.auto=create-drop к своим свойствам, чтобы таблицы создавались автоматически и обновлялись в моей базе данных PostgreSQL.

Проблема заключается в следующем.Мой MVC должен иметь возможность создавать, редактировать, обновлять и удалять любой фильм, пользователя и аренду.Я понимаю, что это можно заменить следующим образом: выбор пользователя, выбор фильма, добавление фильма в набор фильмов пользователя, добавление пользователя в набор пользователей фильма и сохранение.То же самое касается удаления или редактирования.

Но как мне решить эту проблему в моем JSP?Вот как я это делал, когда использовал класс Rentals, в котором были объекты Users и Movie:

<form:form action="${addAction}" modelAttribute="rental">
<table><tr><td>
            <form:label path="user.usrid">
                <spring:message text="ID User"/>
            </form:label>
        </td><td>
            <form:select path="user.usrid">
                <form:options items="${listUsers}" itemValue="usrid" itemLabel="fullName"/>
            </form:select>
        </td></tr><tr><td>
            <form:label path="movie.movid">
                <spring:message text="ID Movie"/>
            </form:label>
        </td><td>
            <form:select path="movie.movid">
                <form:options items="${listMovies}" itemValue="movid" itemLabel="title"/>
            </form:select>
        </td></tr>

    <tr><td colspan="2">
        <input type="submit" value="<spring:message text="Add Rental"/>" />
    </td></tr>
</table></form:form>

И у контроллера были следующие методы:

@RequestMapping(value = "/rentals", method = RequestMethod.GET)
public String listRentals(Model model) {
    model.addAttribute("rental", new Rentals());
    model.addAttribute("listUsers", this.murService.getUsers());
    model.addAttribute("listMovies", this.murService.getMovies());
    model.addAttribute("listRentals", this.murService.getRentals());
    return "rental";
}

@RequestMapping(value = "/rentals/add", method = RequestMethod.POST)
public String addRental(@ModelAttribute("rental") Rentals rnt) {

    if (!checkIfExists(rnt)) {
        this.murService.addRental(rnt);
    } else {
        System.out.println("Couldn't be added, rent already exists.");
    }

    return "redirect:/rentals";
}

Iиспользовал ModelAttribute для объекта Rentals, но теперь, когда у меня нет этого класса, на что должен указывать ModelAttribute?Если я прав в том, как, по моему мнению, это может быть, как я могу отправить два атрибута ModelAttributes, один в качестве пользователей и один в качестве фильмов?Или какой способ сделать то, что мне нужно?

1 Ответ

0 голосов
/ 24 сентября 2019

Нет причин, по которым вы не можете продолжать использовать класс Rental, вам просто нужно больше думать о вашей базе данных.

1) User, Movie являются сущностями.

2) Rental является частью ваших объектов просмотра.

Хотите перечислить все варианты аренды?Прочитайте всю свою базу данных и для каждого пользователя создайте прокат для каждого из фильмов.Передай это своей модели.Вы хотели создать новую аренду?Выберите пользователя в вашем прокате из базы данных и добавьте фильм в набор movies.

Итак, теперь Rental является частью объекта просмотра и не требует сохранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...