[英]org.hibernate.MappingException: Foreign key must have same number of columns as the referenced primary key
[英]JPA mapping annotation error org.hibernate.MappingException: Foreign key must have same number of columns as the referenced primary key
我无法使用JPA注释来支持map数据库表。
表科目和地点是多对多通过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映射文档中了解有关此对象的更多信息,这是映射 Person
和PersonSubjectPlace
实体所需要的:
在您的Person类中:
@OneToMany(mappedBy="person")
private List<PersonSubjectPlace> personsubjectPlaces;
在您的PersonSubjectPlace类中:
@ManyToOne
@JoinColumn(name="PRSID") //Specify the primary key of Person
private Person person;
有关JoinColumn
和mappedBy
之间的区别的更多信息,请查看此答案 。
对于SubjectPlace
和PersonSubjectPlace
之间的映射:
在您的SubjectPlace类中:
@OneToMany(mappedBy="subjectPlace")
private List<PersonSubjectPlace> personsubjectPlaces;
在您的PersonSubjectPlace类中:
@ManyToOne
@JoinColumn(name="SPID") //Specify the primary key of SubjectPerson
private SubjectPlace subjectPlace;
注意:
映射这些类的最佳方法是使用@JoinTable
之间Person
和SubjectPlace
,看看这个@JoinTable例子 ,因为PersonSubjectPlace
是pratically之间的asociation实体Person
和SubjectPlace
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.