2011-10-28 1 views
1

vaannila에서 주어진 예제로 Annotation을 사용하여 Hibernate Mapping many-to-many를 시도했습니다. 최대 절전 many-to-many, 동일한 레코드를 중복합니다.

http://www.vaannila.com/hibernate/hibernate-example/hibernate-mapping-many-to-many-using-annotations-1.html

 Set<Course> courses = new HashSet<Course>(); 
     courses.add(new Course("Maths")); 
     courses.add(new Course("Computer Science")); 

     Student student1 = new Student("Eswar", courses); 
     Student student2 = new Student("Joe", courses); 
     session.save(student1); 
     session.save(student2); 

이 일이 잘 작동합니다. 하지만 그것은 테이블에 다시 학생 Eswar를 복제,

 Set<Course> courses = new HashSet<Course>(); 
     courses.add(new Course("Science")); 
     Student student = new Student("Eswar", courses); 
     session.save(student); 

기존 학생 등으로, 나중에 다른 코스를 추가하려고합니다.

 +------------+--------------+ 
     | STUDENT_ID | STUDENT_NAME | 
     +------------+--------------+ 
     |   1 | Eswar  | 
     |   2 | Joe   | 
     |   3 | Eswar  | 
     +------------+--------------+ 

기존 Eswar에 코스를 추가 할 수 없습니까? 이 문제에 대한 귀하의 도움에 정말 감사드립니다.

답변

0

먼저 데이터베이스에서 학생을 얻은 다음 해당 개체에 코스를 추가 한 다음 가져온 개체를 저장해야합니다.

이렇게하면 "Student"라는 새 인스턴스를 만들고이 새로운 student 객체는 "ID"인스턴스 변수에 null을 갖습니다. 하이버 네이트는이 인스턴스 변수를 검색을 위해 프라이 머리 키에 매핑해야한다. ID가 발견되면 레코드가 업데이트되고 그렇지 않으면 새로운 레코드가 삽입된다 ..

그리고 예, 기존 학생은 U가 먼저 가져온 학생 객체에서 집합을 얻고 싶을 수 있습니다. 그런 다음 해당 집합에 코스를 추가 한 다음 저장합니다. 그렇지 않으면 새 해시 세트에 새 코스 만 포함되고 이전 레코드는 덮어 쓰여집니다.

+1

"It seems to me"로 시작하는 문장을 제외하고 귀하의 대답은 OK입니다. Session.save는 항상 삽입을 시도합니다. 기존 엔티티를 업데이트하지 않습니다. –

+0

@JBNizet okz, 실제로 다시 내 모습에서 개체를 저장하거나 업데이트 된, 개체의 기본 키 값의 존재를 기반으로 .... 나는 그것을 다시 확인하고 우리가 사용하고있는 것으로 나타났습니다 session.saveOrUpdate (인스턴스) 메서드 ..... 수정을위한 감사 ..... – Zohaib

+0

Zohaib 및 JB Nizet, 대단히 감사합니다! 이제 saveOrUpdate()가 제대로 작동합니다. 두 가지 도움에 다시 한 번 감사드립니다! :) –

관련 문제