1

多対多に関連する 2 つのマップされた型があります。

@Entity
@Table(name = "students")
public class Student{

...

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
    name = "students2courses",
    joinColumns = { @JoinColumn(
        name = "student_id",
        referencedColumnName = "_id") },
    inverseJoinColumns = { @JoinColumn(
        name = "course_id",
        referencedColumnName = "_id") })

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

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

...
}

__

@Entity
@Table(name = "courses")
public class Course{

...

@ManyToMany(fetch = FetchType.EAGER, mappedBy = "courses")

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

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

...
}

ただし、Course エンティティを更新/削除すると、students2courses テーブルでレコードが作成/削除されません。(学生エンティティの更新/削除は期待どおりに行われます)

抽象クラス HibObject を書きました

public abstract class HibObject {
    public String getRemoveMTMQuery() {
        return null;
    }
}

Student と Course に継承されます。

DAO で、このコードを追加しました (delete() メソッド用):

String query = obj.getRemoveMTMQuery();
if (query != null) {
    session.createSQLQuery(query).executeUpdate();
}

そして、コースの getRemoveMTMQuery() メソッドを上書きしました

@Override
@Transient
public String getRemoveMTMQuery() {
    return "delete from students2courses where course_id = " + id + ";";
}

今は動作しますが、コードが悪いと思います。

この問題を解決する最善の方法はありますか?

4

0 に答える 0