Spring Hibernate - 使用现有类别保存笑话

时间:2018-05-25 16:02:31

标签: java spring spring-boot

我一直处理一个我需要你帮助的问题。

@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方法中使用它来发送我在表单中明确选择的类别的笑话。我想我错过了一些我尚未接受的重要方面。

1 个答案:

答案 0 :(得分:0)

第一步是在控制器中硬编码设置类别,以确保正确保存。我也会在笑话类中减少你的级联,因为我不会想到保存一个笑话应该能够修改该类别的属性。

一旦你知道你可以用硬编码类别保存一个笑话,我们可以选择在ui中选择类别。现在你不能轻易地将类别直接设置到笑话对象中,你会发现将值传递给控制器​​并使用它来选择后端的类别要容易得多。 如果您按照

的方式尝试
 <p>Category: <input type="text" name="categoryid" /></p>

jokeSubmit(@ModelAttribute Joke joke, @Requestparam("categoryid") String categoryid) {

现在这应该可行了,虽然可能更干净,但是你正在实现我的一个小挫折:你在你的ui层中使用你的db对象,理想情况下ORM对象不应该用作表单对象,尽管它是范围的对于这个问题,我很乐意与你讨论代码概念的分离。