首页 > 解决方案 > Hibernate AnnotationException:使用@OneToMany 或@ManyToMany 定位未映射的类

问题描述

我知道这个问题之前已经提出过很多次了,但我仍然对我的错误可能在哪里感到困惑:

AnnotationException:使用@OneToMany 或@ManyToMany 以未映射的类为目标:com.collab.collabplatform.persistance.entities.CategoryModel.category2projectRel[com.collab.collabplatform.persistance.keys.Category2ProjectRelKey]

CREATE TABLE IF NOT EXISTS `category2projectRel`
(
    `project_id`  bigint(20) NOT NULL,
    `category_id` bigint(20) NOT NULL,
    PRIMARY KEY (`project_id`, `category_id`),
    CONSTRAINT `FK_category2project_project_id` FOREIGN KEY (`project_id`) REFERENCES `project` (`id`),
    CONSTRAINT `FK_category2project_category_id` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

以及实体和关键类:

@Entity
@Table(name = "\"category2projectRel\"")
@NoArgsConstructor
@Getter
@Setter
public class Category2ProjectRelModel {

    @EmbeddedId
    private Category2ProjectRelKey id;

    @ManyToOne
    @MapsId("project_id")
    @JoinColumn(name = "project_id")
    private ProjectModel project;

    @ManyToOne
    @MapsId("category_id")
    @JoinColumn(name = "category_id")
    private CategoryModel category;
}

&

@Getter
@Setter
@NoArgsConstructor
@Embeddable
public class Category2ProjectRelKey implements Serializable {

    @Column(name = "project_id")
    Long projectId;

    @Column(name = "category_id")
    Long categoryId;
}

&

@Entity
@Table(name = "\"category\"")
@NoArgsConstructor
@Getter
@Setter
public class CategoryModel extends BaseEntity {

    @Column
    @NotNull
    private String title;

    @Column
    private String color;

    @OneToMany(mappedBy = "category")
    List<Category2ProjectRelKey> category2projectRel;
}

&

@Entity
@Table(name = "\"project\"")
@NoArgsConstructor
@Getter
@Setter
public class ProjectModel extends BaseEntity {

    @ManyToOne
    @JoinColumn(name="location_id")
    private LocationModel location;

    @NotNull
    @Column
    private String title;

    @NotNull
    @Column(name = "creation_date")
    private OffsetDateTime creationDate;

    @NotNull
    @Column
    private String status;

    @Column(name = "termination_date")
    private OffsetDateTime terminationDate;

    @Column
    private String description;

    @Column
    private Boolean virtual;

    @OneToMany(mappedBy = "project")
    List<Category2ProjectRelKey> category2projectRel;

    @OneToMany(mappedBy = "project")
    List<Project2TagRelKey> project2tagRel;
}

标签: javaspringdatabasespring-boothibernate

解决方案


@ManyToOne @OneToMany @OneToOne @ManyToMany注解应该与实体类一起使用(用@Entity注解的类)

因此,在CategoryModel类中,您将 @OneToMany 与Category2ProjectRelKey类一起使用,它不是实体。

@OneToMany(mappedBy = "category") // this annotation should target an entity class
List<Category2ProjectRelKey> category2projectRel;

一个类上的@Embeddable注解,并不意味着它是一个实体,而是意味着它代表了一组可以包含在其他实体中的更多列。


推荐阅读