我一直处理一个我需要你帮助的问题。
@Controller 公共类JokeController {
@Autowired
JokeRepository jokeRepository;
CategoryRepository categoryRepository;
public Category dark_humor = new Category("Dark Humor");
public Category sports_and_athletes = new Category("Sports And Athletes");
@GetMapping("/new")
public String jokeForm(Model model) {
model.addAttribute("joke", new Joke());
return "jokeForm"; // jokeForm.html
}
@PostMapping("/new")
public String jokeSubmit(@ModelAttribute Joke joke) {
//joke.setCategory(dark_humor);
jokeRepository.save(joke);
return "redirect:/new";
//return "resultJoke"; // resultCategory.html
}
}
我的实体:
关系是类别可以有很多笑话,但笑话只能属于一个类别。
分类 @实体 公共类别{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@Column(name = "name")
private String name;
public Category() {
}
public Category(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Category{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
笑话
@Entity 公共课Joke {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int joke_id;
@Column(name = "likes")
@Value("${some.key:0}")
private int likes;
@Column(name = "dislikes")
@Value("${some.key:0}")
private int dislikes;
@Column(name = "content")
@NotNull
private String content;
@ManyToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
@NotNull
@JoinColumn(name = "category_id")
private Category category;
public Joke() {
}
public Joke(@NotNull String content, @NotNull Category category) {
this.content = content;
this.category = category;
}
public int getJoke_id() {
return joke_id;
}
public void setJoke_id(int joke_id) {
this.joke_id = joke_id;
}
public int getLikes() {
return likes;
}
public void setLikes(int likes) {
this.likes = likes;
}
public int getDislikes() {
return dislikes;
}
public void setDislikes(int dislikes) {
this.dislikes = dislikes;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
@Override
public String toString() {
return "Joke{" +
"joke_id=" + joke_id +
", likes=" + likes +
", dislikes=" + dislikes +
", content='" + content + '\'' +
", category=" + category +
'}';
}
}
我的百里香:
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Getting Started: Handling Form Submission</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Form</h1>
<form action="#" th:action="@{/new}" th:object="${joke}" method="post">
<p>Content: <input type="text" th:field="*{content}" /></p>
<p>Category: <input type="text" th:field="*{category}" /></p>
<p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
</form>
</body>
</html>
*Specifically in this section:*
@PostMapping("/new")
public String jokeSubmit(@ModelAttribute Joke joke) {
//joke.setCategory(dark_humor);
jokeRepository.save(joke);
return "redirect:/new";
//return "resultJoke"; // resultCategory.html
}
我希望Hibernate使用现有类别保存新的笑话。但我不确定我的表单如何能够加载所有现有的类别,以及如何在我的Post方法中使用它来发送我在表单中明确选择的类别的笑话。我想我错过了一些我尚未接受的重要方面。
答案 0 :(得分:0)
第一步是在控制器中硬编码设置类别,以确保正确保存。我也会在笑话类中减少你的级联,因为我不会想到保存一个笑话应该能够修改该类别的属性。
一旦你知道你可以用硬编码类别保存一个笑话,我们可以选择在ui中选择类别。现在你不能轻易地将类别直接设置到笑话对象中,你会发现将值传递给控制器并使用它来选择后端的类别要容易得多。 如果您按照
的方式尝试 <p>Category: <input type="text" name="categoryid" /></p>
和
jokeSubmit(@ModelAttribute Joke joke, @Requestparam("categoryid") String categoryid) {
现在这应该可行了,虽然可能更干净,但是你正在实现我的一个小挫折:你在你的ui层中使用你的db对象,理想情况下ORM对象不应该用作表单对象,尽管它是范围的对于这个问题,我很乐意与你讨论代码概念的分离。