JPA - неверный номер столбца одного класса. должно быть 2 - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь сопоставить свой класс с базой данных, ссылку на класс с помощью «id_comment_parent», но при запуске теста я получаю следующую ошибку:

Caused by: org.hibernate.AnnotationException: A Foreign key refering com.ecommerce.entities.Comment from com.ecommerce.entities.Comment has the wrong number of column. should be 2
at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:646) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:102) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processEndOfQueue(InFlightMetadataCollectorImpl.java:1814) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]

это мой класс:

@Entity
@Table(name = "comment", catalog = "Ecommerce_db")
public class Comment implements Serializable {

    @EmbeddedId
    @AttributeOverrides({
            @AttributeOverride(name = "idComment", column = @Column(name = "id_comment", nullable = false)),
            @AttributeOverride(name = "idCommentParent", column = @Column(name = "id_comment_parent", nullable = false)) })
    private CommentId id;
    @Column(name = "id_user", nullable = false)
    private long idUser;
    @Column(name = "comment", length = 65535)
    private String comment_1;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_comment_parent", nullable = false, insertable = false, updatable = false)
    private Comment comment;

}

Кто-нибудь есть идеи?

1 Ответ

0 голосов
/ 02 марта 2020

Похоже, CommentId, представляющий первичный ключ Comment, имеет более одного столбца. Поэтому ForeignKey также должен иметь более одного JoinColumn.

Кроме того, кажется, что вы смешиваете поля своего первичного ключа и внешнего ключа, так как у вас есть id_comment_parent как в первичном, так и во внешнем ключе.

У вас есть сущности комментариев с одинаковым id_comment, но с другим id_comment_parent? Это не тот случай, я думаю, что более последовательным отображением было бы то, что id_comment является первичным ключом, а id_comment_parent является приоритетным ключом. Как то так:

@Entity
@Table(name = "comment", catalog = "Ecommerce_db")
public class Comment implements Serializable {

    @Id
    @Column(name = "id_comment", nullable = false)
    private Long id;

    @Column(name = "id_user", nullable = false)
    private long idUser;
    @Column(name = "comment", length = 65535)
    private String comment_1;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_comment_parent")
    private Comment parent;
}
...