gpt4 book ai didi

java - 多对一关系的复合主键不支持映射报错

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:09:34 25 4
gpt4 key购买 nike

我有三个实体,它们通过具有复合主键和其他表的外键来形成关联关系。这些是这些实体的实现:

@Entity
@Table(name = "STUDENTSCOURSES", schema = "GPA")
@NamedQuery(name = "getAllStdCrs", query = "SELECT sc FROM StudentsCourses sc")
@IdClass(StudentCourseId.class)
public class StudentsCourses implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@Column(name="studentID", insertable=false, updatable= false)
private int studentID;

@Id
@Column(name="crsID", insertable=false, updatable=false)
private int crsID;

@ManyToOne
@JoinColumn(name="STUDENTID")
Student student;

@ManyToOne
@JoinColumn(name="CRSID")
Course course;

public StudentsCourses() {
super();
}

public void setStudentID(int studentID) {
this.studentID = studentID;
}
public int getStudentID() {
return studentID;
}
public void setCrsID(int crsID) {
this.crsID = crsID;
}
public int getCrsID() {
return crsID;
}
}

类(class)实体:

@Entity
@Table(name = "COURSES", schema = "GPA")
@NamedQuery(name = "getAllCourses", query = "SELECT c FROM Course c")
public class Course implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="CRSID")
private int crsID;
private String name;

@OneToMany(mappedBy="course", fetch=FetchType.LAZY)
private Set<Assesment> assesments;

@OneToMany(mappedBy="course", fetch=FetchType.LAZY)
private Set<StudentsCourses> studentCourses;

public Course() {
super();
}

public int getCrsID() {
return crsID;
}

public void setCrsID(int crsID) {
this.crsID = crsID;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public void setAssesments(Set<Assesment> assesments) {
this.assesments = assesments;
}

public Set<Assesment> getAssesments() {
return assesments;
}

public void setStudentCourses(Set<StudentsCourses> studentCourses) {
this.studentCourses = studentCourses;
}

public Set<StudentsCourses> getStudentCourses() {
return studentCourses;
}
}

学生实体:

@Entity
@Table(name = "STUDENTS", schema = "GPA")
@NamedQuery(name = "getAllStudents", query = "SELECT s FROM Student s")
public class Student implements Serializable {


private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int studentID;
private String studentName;

@OneToMany(mappedBy="student", fetch = FetchType.LAZY)
private Set<Assesment> assesments;

@OneToMany(mappedBy="student", fetch = FetchType.LAZY)
private Set<StudentsCourses> studentCourses;

public Student() {
super();
}

public int getStudnetID() {
return studentID;
}

public void setStudnetID(int stdID) {
this.studentID = stdID;
}

public void setStudentName(String studentName) {
this.studentName = studentName;
}

public String getStudentName() {
return studentName;
}

public void setAssesments(Set<Assesment> assesments) {
this.assesments = assesments;
}

public Set<Assesment> getAssesments() {
return assesments;
}

public void setStudentCourses(Set<StudentsCourses> studentCourses) {
this.studentCourses = studentCourses;
}

public Set<StudentsCourses> getStudentCourses() {
return studentCourses;
}
}

当我尝试启动程序时出现以下错误:

[4/5/13 0:30:15:243 EDT] 00000028 webapp        E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet Error]-[com.gpa.app.servlet.LoginServlet]: <openjpa-2.1.1-SNAPSHOT-r422266:1141200 fatal user error> org.apache.openjpa.persistence.ArgumentException: Field "com.gpa.app.entities.Course.studentCourses" cannot declare that it is mapped by another field. Its mapping strategy (org.apache.openjpa.jdbc.meta.strats.HandlerFieldStrategy) does not support mapping by another field.

问题的原因可能是什么。感谢您的帮助。

最佳答案

所以问题出在我的@Id 类中。在那个类中,我没有实现相等和哈希码方法,也没有实现可序列化。完成后一切顺利。感谢 Eelke,他给了我尝试不同版本的想法,这帮助我找出了原因。

我修改后的代码如下所示:

public class StudentCourseId implements Serializable{

private static final long serialVersionUID = 1L;
private int studentID;
private int crsID;

public StudentCourseId() {
}

public StudentCourseId(int studentID, int crsID) {
this.studentID = studentID;
this.crsID = crsID;
}

public void setStudentID(int studentID) {
this.studentID = studentID;
}

public int getStudentID() {
return studentID;
}

public void setCrsID(int crsID) {
this.crsID = crsID;
}

public int getCrsID() {
return crsID;
}
public int hashCode() {
return studentID + crsID;
}

public boolean equals(Object o) {
return ((o instanceof StudentCourseId)
&& studentID == ((StudentCourseId) o).getStudentID() && crsID == ((StudentCourseId) o)
.getCrsID());
}
}
public int getCrsID() {
return crsID;
}
}

希望对以后的人有所帮助。

谢谢,SAS

关于java - 多对一关系的复合主键不支持映射报错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15826029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com