0

私はJpa、Hibernateを使用しています。
私のプロジェクトで非常に奇妙なことが起こっています。
私は2つのエンティティを持っています.学生とコース、多対多の関係です。
長い間、すべてが完璧に機能していましたが、突然この問題が発生しました:
特定の学生 (em.find) を見つけてから、ゲッター (student.getCourses) を使用してそのコースのリストを返すと、リストの一部しか受信しません! そして、クエリでそれを行うと(「id = ...の学生sからs.coursesを選択」)-正しい結果が得られます。
私は長い間それを解決しようとしましたが、何も解決しませんでした。
問題が何であるかを知っている人はいますか?
どんな助けでも大歓迎です!
これが私のコードです:

/**
* Entity: Course のエンティティ実装クラス
*
*/
@Entity(name = "Courses")

public class Course extends Stamping {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String courseName;
@Version
@Column(name = "Version", nullable = false)
private Long version;

@ManyToMany(mappedBy = "courses",fetch = FetchType.LAZY)
private Set<Student> students = new HashSet<Student>();

@ManyToOne
@JoinColumn(name = "LecturerID")
private Lecturer lecturer;


public Course() {
    super();
    this.courseName = " ";

}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getCourseName() {
    return courseName;
}

public void setCourseName(String courseName) {
    this.courseName = courseName;
}

public Lecturer getLecturer() {
    return lecturer;
}

public void setLecturer(Lecturer lecturer) {
    this.lecturer = lecturer;
}

public Set<Student> getStudents() {
    return students;
}

public void setStudents(Set<Student> students) {
    this.students = students;
}


public Long getVersion() {
    return version;
}

public void setVersion(Long version) {
    this.version = version;
}

}

/**
* エンティティのエンティティ実装クラス: Student
*
*/
@Entity

public class Student extends Person / and Person class extends Stamping /{

private static final long serialVersionUID = 1L;

@Enumerated(EnumType.STRING)
@Column(length = 2)
private E_Year studentYear;
private Boolean inCondition;

@ManyToMany(cascade = PERSIST, fetch = FetchType.LAZY)
private Set<Course> courses = new HashSet<Course>();

public Student() {
    super();
    this.inCondition = true;
}

public E_Year getStudentYear() {
    return studentYear;
}

public void setStudentYear(E_Year studentYear) {
    this.studentYear = studentYear;
}

public Boolean getInCondition() {
    return inCondition;
}

public void setInCondition(Boolean inCondition) {
    this.inCondition = inCondition;
}


public Set<Course> getCourses() {
    return courses;
}

public void setCourses(Set<Course> courses) {
    this.courses = courses;
}

}

/**
* Entity: Stamping のエンティティ実装クラス
*
*/
@MappedSuperclass

public class Stamping は Serializable を実装します {

private static final long serialVersionUID = 1L;

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created", nullable = false)
private Date created;

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "updated", nullable = false)
private Date updated;

private String lastUser;

public Date getCreated() {
    return created;
}

public Date getUpdated() {
    return updated;
}

public String getLastUser() {
    return lastUser;
}

@PrePersist
protected void onCreate() {
    updated = created = new Date();
    lastUser = System.getProperty("user.name"); 
}

@PreUpdate
protected void onUpdate() {
    updated = new Date();
    lastUser = System.getProperty("user.name"); 
}

public Stamping() {
    super();
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((created == null) ? 0 : created.hashCode());
    result = prime * result
            + ((lastUser == null) ? 0 : lastUser.hashCode());
    result = prime * result + ((updated == null) ? 0 : updated.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Stamping other = (Stamping) obj;
    if (created == null) {
        if (other.created != null)
            return false;
    } else if (!created.equals(other.created))
        return false;
    if (lastUser == null) {
        if (other.lastUser != null)
            return false;
    } else if (!lastUser.equals(other.lastUser))
        return false;
    if (updated == null) {
        if (other.updated != null)
            return false;
    } else if (!updated.equals(other.updated))
        return false;
    return true;
}

}

4

1 に答える 1

0

問題は解決しました...
学生とコースの両方の基本クラスがあり、Eclipseから生成されたHashCodeメソッドとEqualsメソッドがあったため、すべてが発生したことがわかりました。
これらのメソッドを削除した後、すべてが正常に機能します。
なぜそれが起こるのか誰かが説明できますか?
ありがとう。

于 2012-08-27T05:25:31.317 に答える