java - 使用 Spring MVC、JPA 和 Hibernate 添加 ManyToMany

标签 java spring hibernate spring-mvc jpa

在我的 Spring MVC 项目中,我创建了两个类,它们以 ManyToMany 方式连接,如下所示:

用户(ID、余额、姓氏和名字) -> 租赁(用户ID, 电影ID) <- 电影( 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 = createhibernate.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>

Controller 有这些方法:

@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";
}

我对 Rentals 对象使用了 ModelAttribute,但现在我没有该类,ModelAttribute 应该指向什么?如果我的想法是正确的,我如何发送两个 ModelAttributes,一个作为用户,一个作为电影?或者有什么方法可以满足我的需要?

最佳答案

没有理由你不能继续使用Rental类,你只需要更多地考虑你的数据库。

1) UserMovie 是实体。

2) Rental 是 View 对象的一部分。

您想列出所有出租吗?读取您的整个数据库,并为每个用户创建每部电影的租赁。将其传递给您的模型。您想创建新的租赁吗?从数据库中选择您租借的用户并将电影添加到电影集中。

所以,现在 Rental 是 View 对象的一部分,不需要持久化。

关于java - 使用 Spring MVC、JPA 和 Hibernate 添加 ManyToMany,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58071368/

相关文章:

java - 字符串解耦和字段名称

java - For Loop NullPointerException 与 Apache POI

java - Java中线程安全类的解释

java - 在 GitHub 上公开时隐藏字符串 <property name ="password"value ="***"/>?

java - hibernate 中的内连接

Java Hibernate OneToOne 异常映射错误?

java - 我可以使用 JAVAC 来编译包含多个文件和目录的项目吗?

java - 如何从 SearchMatch 对象获取行号?

java - 使用 Splitter 和其他一些组件后如何保持相同的相关 ID?

java - Spring bean 多次加载