首页 > 解决方案 > 如何与hibernate建立1:n关系?

问题描述

我正在使用hibernate来表示具有三个主要实体用户、项目和评论的数据库。用户和项目继承自基类。该项目还拥有无限量的评论。在 POJO 中,我尝试用List<Comment>.

我的主要问题是,当我去拿一个在列表中包含许多评论引用的项目时,java 会抛出一个 IllegalArgumentException 说它无法访问评论的 id 字段,因为它只获得一个 ArrayList。

Caused by: java.lang.IllegalArgumentException: Can not set int field com.project.objects.Comment.id to java.util.ArrayList

我的课程如下 - 没有 Constructor/Setter/Getter,因为它们很简单:

@MappedSuperclass
public abstract class Base {
    @Id
    @Column
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column
    private String name;
    @Column
    private String longDesc;
    @Column
    private String briefDesc;
    @Column
    @ElementCollection(targetClass=String.class)
    private List<String> goals;
    @Column
    private String picture;
    @Column
    private int cType;
@Entity(name = "Project")
@Table(name = "project")
public class Project extends Base {
    @Column
    private String start;
    @Column
    private String end;
    @Column
    private String manager;
    @ElementCollection(targetClass=Comment.class)
    @ManyToOne(targetEntity = Comment.class, fetch = FetchType.EAGER)
    @JoinColumn(name = "comment_id")
    private List<Comment> comments;
@Entity(name = "Comment")
@Table(name = "comment")
public class Comment {
    @Id
    @Column(name="comment_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column
    private String comment;
    @Column
    private int rating;
    @Column
    private int pcuser;
    @Column
    private int cType;

标签: javahibernateinheritance

解决方案


您的 1:N 关联是错误的,因为它现在实际上是 N:1。正确的是:

Entity(name = "Project")
@Table(name = "project")
public class Project extends Base {
    @Column
    private String start;
    @Column
    private String end;
    @Column
    private String manager;
    @OneToMany(mappedBy = "project", fetch = FetchType.EAGER)
    private List<Comment> comments;

在你的Comment课堂上:

@Entity(name = "Comment")
@Table(name = "comment")
public class Comment {
    @Id
    @Column(name="comment_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column
    private String comment;
    @Column
    private int rating;
    @Column
    private int pcuser;
    @Column
    private int cType;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "id_project", nullable = false)
    private Project project;
    // THIS is the required and obrigatory mapping that you forgot.
    // It's the foreing key itself

免责声明

我以前从未真正使用过带有继承的 Hibernate(通常,它对于关系数据库来说非常复杂且效率低下),但请查看“https://www.baeldung.com/hibernate-inheritance”和“https://marcin-chwedczuk” .github.io/mapping-inheritance-in-hibernate`了解更多信息。

推荐阅读