2011-10-28 47 views
1

我試過Hibernate映射多對多使用註釋在vaannila中給出的例子。休眠多對多,重複相同的記錄

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); 

這件事工作正常。但是,如果我稍後嘗試添加其他課程,但對於現有學生來說,

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

它在表中再次複製學生Eswar。

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

我不能將課程添加到現有的Eswar嗎? 我真的很感謝你對這個問題的幫助。

回答

0

您首先需要從數據庫獲取學生,然後向該對象添加課程,然後保存獲取的對象。

這樣,您正在創建一個新的Student對象,這個新的學生對象在「ID」實例變量中有一個空值。在我看來,Hibernate必須將這個實例變量映射到主鍵查找,如果發現id,記錄被更新,否則插入新記錄。

是的,如果你需要添加課程現有的學生,U可能希望首先從獲取的學生對象中獲取集合,然後在該集合中添加一個課程,然後保存......否則新的哈希集合將僅包含新課程,並且之前的記錄將被覆蓋。

+1

你的回答是可以的,除了以「在我看來」開頭的句子。 Session.save總是試圖插入。它不更新現有的實體。 –

+0

@JBNizet okz,我再次查找它,實際上在我的情況下,對象是保存或更新,基於對象的主鍵值的存在....我再次檢查並發現我們使用session.saveOrUpdate(實例)方法..... 感謝您糾正..... – Zohaib

+0

Zohaib和JB Nizet,非常感謝您的大力支持! 現在它使用saveOrUpdate()工作正常。 再次感謝您的幫助! :) –