拥有一个Java/Springboot/Thymeleaf/Hibernate/SQL
应用程序,该程序允许管理员发布新文章。每篇文章都与特定主题相关。在SQL
中,我有一个topic table
,一个articles table
和一个join table
,分别存放着articleIds
和topicsIds
。
当我通过该应用添加新文章时,应该在文章表的"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);
}
答案 0 :(得分:0)
您不应在“文章”表中包含主题列。根据您的解释,您会遇到“多对多”的情况,其中一篇文章可以有多个主题,而一个主题可以与许多文章相关联。
要满足此要求,您已经创建了一个联接表,那么我不明白为什么您再次在Article表中创建了topic列。简单地说,您不能在一个字段中包含多个数据。因此,如果一篇文章有3个主题,那么如何将这3个主题放在同一列中。
我建议您通过this链接来正确理解“多对多”案例以及如何在休眠状态下处理它们。