繁体   English   中英

JPA映射注释错误org.hibernate.MappingException:外键必须具有与引用的主键相同的列数

[英]JPA mapping annotation error org.hibernate.MappingException: Foreign key must have same number of columns as the referenced primary key

我无法使用JPA注释来支持map数据库表。 D b

科目地点是多对多通过JoinTable。

Subject.java

@Entity
@Table(name = "SUBJECT")
public class Subject implements Serializable {
    @Id
    @Column(name = "SID")
    private Integer sid;

    @Column(name = "NAME")
    private String name;

    // getters and setters
}

SubjectPlace.java

@Entity
@Table(name = "SUBJECT_PLACE")
public class SubjectPlace implements Serializable {
    @Id
    @Column(name = "SPID")
    private Integer spid;

    @ManyToOne
    @JoinColumn(name = "SUB_KEY") //Subject FK
    private Subject subject;

    @ManyToOne
    @JoinColumn(name = "PLC_KEY") //Place FK
    private Place place;

    // getters and setters
}

Place.java

@Entity
@Table(name = "PLACE")
public class Place implements Serializable {
    @Id
    @Column(name = "PID")
    private Integer pid;

    @Column(name = "NAME")
    private String name;

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
        @JoinTable(name = "SUBJECT_PLACE",
            joinColumns = { @JoinColumn(name = "PLC_KEY", nullable = false, updatable = false) },
            inverseJoinColumns = { @JoinColumn(name = "SUB_KEY", nullable = false, updatable = false) })
    private Set<Subject> subjects;

    // getters and setters
}

但是比我需要在选定的地方将“ 人”与“ 主题”链接在一起。 我的意思是每个地方都有自己的Subject集合。 与某个人有关联的主题链接位于特定的地方。

像这样:

Subject (M) -- (M) Place通过JoinTable Subject (M) -- (M) Place位置Subject (1) -- (M) Subject_Place (M) -- (1) Place

Person (M) -- (M) Subject_Place通过JoinTable的Person (M) -- (M) Subject_Place Person (1) -- (M) Person_Subject_Place (M) -- (1) Subject_Place

Person.java

@Entity
@Table(name = "PERSON")
public class Person implements Serializable {
    @Id
    @Column(name = "PRSID")
    private Integer prsid;

    @Column(name = "NAME")
    private String name;

    // How to annotate this code?
    // I experience problem in this part of code
    @OneToMany
    @JoinColumn(name="SPID_KEY") 
    private List<SubjectPlace> subjectPlaces;

    // getters and setters
}

PersonSubjectPlace.java

@Entity
@Table(name = "PERSON_SUBJECT_PLACE")
public class PersonSubjectPlace implements Serializable {
    @Id
    @Column(name = "PSPID") // Person_Subject_Place ID
    private Integer pspid;

    @ManyToOne
    @JoinColumn(name = "PER_KEY") //Person FK
    private Person person;

    // How to annotate this code?
    // I experience problem in this part of code
    @ManyToOne
    @JoinColumn(name = "SPID_KEY") //Subject_Place FK
    private SubjectPlace subjectPlace;

    // getters and setters
}

当我尝试获取“人物及其主题”时,出现以下错误: Caused by: org.hibernate.MappingException: Foreign key (FK2C3B79384AABC975:PERSON_SUBJECT_PLACE [SPID_KEY])) must have same number of columns as the referenced primary key (SUBJECT_PLACE [PLC_KEY,SUB_KEY])

什么,我应该如何映射?

您应该删除@Joincolumn标注和添加mappedBy变量@OneToMany注解。

@OneToMany(mappedBy = "spid")

您应该在SubjectPlace中具有一个Person变量,并在其中放置@JoinColumn批注

在您的OneToMany映射中,您无需指定外键,只需要使用mappedBy属性来引用您的映射对象,就可以在OneToMany映射文档中了解有关此对象的更多信息,这是映射 PersonPersonSubjectPlace实体所需要的:

在您的Person类中:

@OneToMany(mappedBy="person")
private List<PersonSubjectPlace> personsubjectPlaces;

在您的PersonSubjectPlace类中:

@ManyToOne
@JoinColumn(name="PRSID") //Specify the primary key of Person
private Person person;

有关JoinColumnmappedBy之间的区别的更多信息,请查看此答案

编辑:

对于SubjectPlacePersonSubjectPlace之间的映射:

在您的SubjectPlace类中:

@OneToMany(mappedBy="subjectPlace")
private List<PersonSubjectPlace> personsubjectPlaces;

在您的PersonSubjectPlace类中:

@ManyToOne
@JoinColumn(name="SPID") //Specify the primary key of SubjectPerson
private SubjectPlace subjectPlace;

注意:

映射这些类的最佳方法是使用@JoinTable之间PersonSubjectPlace ,看看这个@JoinTable例子 ,因为PersonSubjectPlace是pratically之间的asociation实体PersonSubjectPlace

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM