表格列未填充,是控制器问题还是联接表问题?

时间:2018-11-14 22:38:39

标签: java sql hibernate spring-boot

拥有一个Java/Springboot/Thymeleaf/Hibernate/SQL应用程序,该程序允许管理员发布新文章。每篇文章都与特定主题相关。在SQL中,我有一个topic table,一个articles table和一个join table,分别存放着articleIdstopicsIds

当我通过该应用添加新文章时,应该在文章表的"Topic"列中填充从下拉字段中选择的任何一个主题名称,您可以选择多个主题,因此理想情况下该列需要收集所有选定的主题名称。

您认为这是我的sql表的问题,还是我需要在控制器中以某种方式设置所选主题?我已经尝试在控制器中进行设置,但是由于从主题中选择了多个"topic",所以不确定我是否正确地抓取了它。

这是我的Article模型代码。

@Entity
@Table(name="Article")
@EntityListeners(AuditingEntityListener.class)
public class Article {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="ArticleId")
    private Long id;

    @LastModifiedDate
    @DateTimeFormat(pattern = "MM/dd/yyyy HH:mm a")
    private LocalDateTime lastModifiedDate;

    private String title;
    private String urlTitle;
    private String contentHtml;
    private String contentText;
    private String topic;
    @ManyToMany(fetch = FetchType.LAZY,
            cascade = {
                    CascadeType.PERSIST,
                    CascadeType.MERGE
            })
    @JoinTable(name = "Article_Topics",
            joinColumns = { @JoinColumn(name = "Article") },
            inverseJoinColumns = { @JoinColumn(name = "Topic") })
    private Set<Topic> topics= new HashSet<>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getUrlTitle() {
        return urlTitle;
    }

    public void setUrlTitle(String urlTitle) {
        this.urlTitle = urlTitle;
    }

    public String getContentHtml() {
        return contentHtml;
    }

    public void setContentHtml(String contentHtml) {
        this.contentHtml = contentHtml;
    }

    public String getContentText() {
        return contentText;
    }

    public void setContentText(String contentText) {
        this.contentText = contentText;
    }

    public Set<Topic> getTopics() {
        return topics;
    }

    public void setTopics(Set<Topic> topics) {
        this.topics = topics;
    }

    public String getTopic() {
        return topic;
    }

    public void setTopic(String topic) {
        this.topic = topic;
    }

    public LocalDateTime getLastModifiedDate() {
        return lastModifiedDate;
    }

    public void setLastModifiedDate(LocalDateTime lastModifiedDate) {
        this.lastModifiedDate = lastModifiedDate;
    }
}

这是保存新主题时控制器的代码:

@RequestMapping(value="/save-article")
    public String addArticle(Model model, @ModelAttribute(value="article")Article newArticle, @ModelAttribute(value="topics")Article topics){
        String newArticleName = newArticle.getTitle().replaceAll("\\s","");
        newArticle.setUrlTitle(newArticleName);

        articleRepository.save(newArticle);
        return adminHome(model);
    }

1 个答案:

答案 0 :(得分:0)

您不应在“文章”表中包含主题列。根据您的解释,您会遇到“多对多”的情况,其中一篇文章可以有多个主题,而一个主题可以与许多文章相关联。

要满足此要求,您已经创建了一个联接表,那么我不明白为什么您再次在Article表中创建了topic列。简单地说,您不能在一个字段中包含多个数据。因此,如果一篇文章有​​3个主题,那么如何将这3个主题放在同一列中。

我建议您通过this链接来正确理解“多对多”案例以及如何在休眠状态下处理它们。