3

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

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

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

4

1 回答 1

1

所以问题出在我的@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;
}   
}

希望它对将来的某人有所帮助。

谢谢,萨斯

于 2013-04-08T01:37:49.060 回答