Столбец таблицы не заполнен, это проблема с контроллером или соединительной таблицей? - PullRequest
0 голосов
/ 15 ноября 2018

Иметь приложение 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);
    }

1 Ответ

0 голосов
/ 15 ноября 2018

Вы не должны иметь столбец темы внутри таблицы Article.Согласно вашему объяснению, у вас есть сценарий «ManyToMany», в котором одна статья может иметь много тем, а одна тема может быть связана со многими статьями.

Чтобы выполнить это требование, вы уже создали таблицу объединения, тогда я не будуне понимаю, почему вы снова создали столбец темы в таблице статей.Проще говоря, вы не можете иметь несколько данных в одном поле.Итак, если в одной статье 3 темы, как вы можете поместить все 3 в один столбец?

Я рекомендую вам пройти по этой ссылке, чтобы получить правильное представление о случаях «многие ко многим» и о том, как обращаться с ними в спящем режиме.

...