java - 如何在 Spring MVC 中提交 ManyToMany 属性

标签 java html spring-mvc thymeleaf

背景

我正在使用 Spring Boot(带有 Thymeleaf 的 Spring MVC)创建一个非常简单的图书数据库。一本书可以有多个作者,一个作者可以写多本书,因此我在 Book 类中创建了一个 @ManyToMany 引用。

Book.java :

@Entity
@Table(name = "book")
public class Book {

    @Id
    @GeneratedValue()
    private Long id;

    private String title;

    @ManyToMany
    @JoinTable(name = "book_author", joinColumns = @JoinColumn(name = "author_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "book_id", referencedColumnName = "id"))
    private List<Author> authors;
...

Author.java :

@Entity
@Table(name="author")
public class Author {

    @Id
    @GeneratedValue()
    private Long id;

    private String name;

    @JsonBackReference
    @ManyToMany(mappedBy="authors")
    private List<Book> books;
...

当我自己插入 SQL 值时,效果很好。

Controller

我有一个@PostMapping,它将接收编辑后的表单。

@GetMapping("/books/{bookId}/edit")
public String editBookForm(@PathVariable(value="bookId") long id, Model model){
    Book book = bookRepository.findOne(id);
    List<Author> authors = new LinkedList<>();
    for ( Author author : authorRepository.findAll())
        authors.add(author);

    model.addAttribute("book", book);
    model.addAttribute("authors", authors);
    return "bookedit";
}


@PostMapping("/books/{bookId}/edit")
public String editBookSubmit(@PathVariable(value="bookId") long id, @ModelAttribute Book book){
    bookRepository.save(book);
    return "redirect:/books/" + id;
}

这是我的表单代码:

<form action="#" th:action="@{/books/{id}/edit(id=${book.id})}" th:object="${book}" method="post">
    <input type="hidden" th:field="*{id}" th:value="${book.id}"/>
    <div class="form-group">
        <label for="title">Book title:</label>
        <input type="text" class="form-control" id="title" th:field="*{title}" th:value="${book.title}"/>
    </div>

    <div class="form-group">
        <label for="author">Authors</label>
        <input list="author"/>

        <datalist id="author">
            <option th:each="author : ${authors}" th:value="${author.name}"></option>
        </datalist>
    </div>
    <input type="submit" class="btn btn-default" value="Save"/>
</form>

我现在有两个问题:

  1. 如何通过多个作者的考试?我考虑过复制<input list="author"/>使用Javascript多次(用户可以单击名为“添加其他作者”的按钮,然后整个字段将被复制)。但是我怎样才能在 Controller 中解析它呢?那么我该如何命名输入列表呢?

  2. 我可以在数据列表中显示作者的姓名,但随后我会将作者的姓名返回给 Controller ,但不是其主键。如果两个作者同名,如何区分? “可见值(value)”和“实际值(value)”之间是否可能存在某种区别?将来,如果是这种情况,我想在作者姓名后添加一些解释行(例如“John Doe(美国作家,1900-1980)”、“John Doe(英国作家,1950-2000))。但这不会是该字段的

感谢您的帮助。

最佳答案

好吧,这并不是那么困难。我的主要问题是我不知道我可以在 <option></option> 之间写入显示值标签。

当为属性传递 id 时,数据绑定(bind)会自动检测其他模型。所以类似 <option value="1">Example book</option>由 Spring 自动正确绑定(bind)。

使用相同的 name 也可以形成数组。 <select>的多次字段。

关于java - 如何在 Spring MVC 中提交 ManyToMany 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43836329/

相关文章:

java - 三元运算符在打印时给出意想不到的结果

javascript - 如果可见,则添加 div 选择以在最后获得总计

html - 尽管设置了最小高度,图像仍扩展了容器 div?

java - 如何防止制作空的 zip 文件

Java - 将带有列表变量的对象转换为对象列表

java - eclipse RCP : Set active part programmatically or get selection of inactive part

javascript - 根据另一个下拉选择 Spring MVC AJAX 填充下拉列表

spring-mvc - <global-method-security> 如何通过 Spring-Security 在我的 Controller 上工作?

Java代码问题: Capping an amount

php - 加载 javascript 和 php 脚本时无法显示加载图像