背景
我正在使用 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>
我现在有两个问题:
如何通过多个作者的考试?我考虑过复制
<input list="author"/>
使用Javascript多次(用户可以单击名为“添加其他作者”的按钮,然后整个字段将被复制)。但是我怎样才能在 Controller 中解析它呢?那么我该如何命名输入列表呢?我可以在数据列表中显示作者的姓名,但随后我会将作者的姓名返回给 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/