5

講師とコースという2つのクラスがあります。私の講師クラスには、示されているように変数のコースオブジェクトのリストがあります

@OneToMany(mappedBy = "lecturer")
@NotFound(action = NotFoundAction.IGNORE)
private List<Course> courseList = new ArrayList<Course>();

私のコースクラスでは、以下のように変数としてLecturerオブジェクトがあります。

@ManyToOne
@JoinTable(name = "course_lecturer", joinColumns = @JoinColumn(name = "course_id"), inverseJoinColumns = @JoinColumn(name = "lecturer_id"))
private Lecturer lecturer;

これで、Lecturerのjsonオブジェクトを次のように返すSpringControllerメソッドができました。

@RequestMapping(value = "/getlecturerbyid", method = RequestMethod.POST)
public @ResponseBody
Object getLecturer(@ModelAttribute(value = "id") Lecturer lecturer) {
    Map<String, Object> response = new HashMap<String, Object>();
    response.put("message", "succeess");
    response.put("lecturer", lecturer);
    return response;
}

問題は、遅延初期化例外をスローすることです。したがって、LecturerクラスとCourseクラスの両方の変数のフェッチタイプをeagerに設定しました。ここで問題となるのは、オブジェクトを熱心にフェッチしようとすることです(どちらかのフェッチの設定を解除すると、同じ例外が発生します)。

一方、いずれかのクラスの変数を削除すると、Hibernateは別のクラスとの関係があることを認識しません。例:Lecturerからコースリストを削除し、Lecturerオブジェクトの1つを削除した場合、hibernateは削除されたLecturerオブジェクトに関連するコースオブジェクトを削除しません。したがって、Hibernateクエリを記述し、コードから手動で削除する必要があります。

この問題を克服する方法について教えてください。

4

2 に答える 2

3

これは、循環参照(親->子->親)が原因で発生しています。私はあなたがその考えを持っていると確信しています。

問題の最も簡単な解決策は、コースのリストを繰り返し、次のように循環関係を壊すLecturer前にnullとして設定することです。response

   Object getLecturer(@ModelAttribute(value = "id") Lecturer lecturer) {
       Map<String, Object> response = new HashMap<String, Object>();
       response.put("message", "succeess");

       //break the circular relationship
       if(lecturer.getCourses() != null){
          for(Course course: lecturer.getCourses()){
               course.setLecturer(null);
          }
       }
       response.put("lecturer", lecturer);
       return response;
   }
于 2012-11-13T02:33:05.313 に答える
-1

この問題は、jackson マッパーを使用している場合は @JsonIgnore アノテーションを使用することで解決できます。 このリンクは、ジャクソンの問題に対処しています。

于 2012-12-08T17:12:16.597 に答える