Неизвестный столбец в списке полей после попытки создания отношения OneToMany - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь создать @OneToMany отношение в спящем режиме. Мне нужно хранить список избирателей для каждой статьи в базе данных. Каждый голос имеет идентификатор пользователя и номер голосования. Мой проект компилируется и запускается, но когда я пытаюсь получить доступ к столбцу @OneToMany, он не существует и выдает ошибку в заголовке.

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

Вот мои сущности, я пропустил большинство полей в статье и получателей и установщиков, потому что они не очень важны для этого вопроса.

Статья:

    @Entity
    @Table(name="articles")
    public class Article implements Serializable {
        private static final long serialVersionUID = 2L;

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private long id;

        @Column(name = "votes")
        private int votes;

        @Column(name = "voters")
        @ElementCollection
        @OneToMany(mappedBy = "vote", cascade = CascadeType.ALL)
        private List<Vote> voters = new ArrayList<>();

Голоса:

    @Entity
    @Table(name = "vote")
    public class Vote {

        public Vote(long userId, int vote){
            setUserId(userId);
            setVote(vote);
        }

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private long id;

        @ManyToOne
        private Article article;

        @Column(name = "userId")
        private long userId;

        @Column(name = "vote")
        private int vote; //either 1, 0, or -1

        public long getId() {
            return id;
        }

Ошибка:

    java.sql.SQLSyntaxErrorException: Unknown column 'voters' in 'field list'
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) ~[mysql-connector-java-8.0.13.jar:8.0.13]
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.13.jar:8.0.13]
        at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.13.jar:8.0.13]
        at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:974) ~[mysql-connector-java-8.0.13.jar:8.0.13]
        (the stack trace continues but I didn't think it was important)

Ошибка возникает только при попытке доступа к столбцу в моем классе контроллера и во время запросов.

Это запрос, который я хочу сделать:

@Modifying
@Transactional
@Query(value = "UPDATE articles SET voters = ?1 WHERE id = ?2", nativeQuery = true)
int updateArticleVoters(List<Vote> newVoters, long id);

Мне просто нужен способ хранения в базе данных двухмерного массива. Я не знаю, есть ли более простой способ сделать это.

Спасибо за любую помощь

1 Ответ

2 голосов
/ 24 апреля 2019

Первая ошибка: вы не можете использовать @Column в ассоциации, вы должны использовать @JoinColumn.

Вторая ошибка: @OneToMany(mappedBy = "something") означает, что @JoinColumn находится на другом объекте (стороне-владельце).

Третья ошибка: @ElementCollection означает, что вы хотите набор не-сущностей (типа Strings, Embeddables или Basic), но здесь Vote - это сущность.

Отображение в Article должно быть:

 @OneToMany(mappedBy = "article", cascade = CascadeType.ALL)
 private List<Vote> voters = new ArrayList<>();

Четвертая ошибка: в вашем UPDATE собственном запросе вы не можете установить Article.voters, поскольку это не столбец, а JPA-коллекция «один ко многим», сопоставленная с «многие к одному» Vote.article. Это базовый JPA, вам лучше прочитать документы по @ManyToOne управлению, прежде чем продолжить.

например. https://www.baeldung.com/jpa-joincolumn-vs-mappedby

...