【发布时间】:2013-03-27 09:39:16
【问题描述】:
我有三个实体,它们通过具有复合主键和其他表的外键来形成关联关系。这些是这些实体的实现:
@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.
问题的原因可能是什么。感谢您的帮助。
【问题讨论】:
-
您尝试做的事情应该是可能的,但我现在没有时间找出问题所在。但是我想指出,StudentCourses 看起来非常像映射到链接表。所以 StudentCourses 实体只在 Student 和 Course 之间建立链接。如果这是正确的,您可以省略 StudentCourses 实体并在 Student 和 Course 之间进行直接的多对多映射。
-
试试这个:@OneToMany(fetch=FetchType.EAGER,cascade={CascadeType.ALL},orphanRemoval=true) @JoinColumn(name="columnName") private Set
studentCourses;跨度> -
@Eelke 感谢您的评论。根据我的应用范围,多对多关系不适合。如果我有一名学生在数据库中存在不止一次,我将无法检索一名特定学生的所有课程。那就是我选择了一对多。感谢您的时间。
-
@Neron 感谢您的回答,我尝试了您的代码,仍然遇到同样的错误。
-
再看一遍,没发现映射有什么问题。 EclipseLink 也没有发现任何问题。我注意到你使用了 openjpa 的快照版本的错误,也许你应该尝试另一个版本。
标签: java jakarta-ee servlets jpa persistence