有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

具有多对一关系的java复合主键不支持映射错误

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

@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;
}   
}

课程实体:

@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.

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


共 (1) 个答案

  1. # 1 楼答案

    所以问题出在我的@Id课程上。在那个类中,我没有实现equal和hash code方法,也没有实现Serializable。做完这件事之后,一切都很顺利。多亏了伊尔克,他给了我尝试不同版本的想法,这帮助我找到了原因

    我在中修改的代码如下所示:

    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