2011-08-23 130 views
-1

會話刷新後,集合數據從數據庫中刪除。似乎Hibernate檢測到原始集合被替換,但在我們的傳統項目中,我們不希望Hibernate執行刪除操作。有什麼辦法可以做到嗎?刷新後休眠集合刪除

下面是示例代碼:

public class Student{ 
    @OneToMany(fetch=FetchType.EAGER) 
    @JoinColumn(name="student_id") 
    private List<Course> courses; 
    ...... 

    public static void main(String[] args){ 
     SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); 
     Session session = sessionFactory.openSession(); 
     session.beginTransaction(); 

     Student s = (Student) session.get(Student.class, id); 
     //set new name 
     s.setName("new name"); 

     // this is neccessary in our project, and I can't change it. 
     List<Course> newCourses = new ArrayList<Course>(); 
     newCourses.add(...); 
     s.setCourses(newCourses); // replace the collection with new 

     //update s 
     session.update(s); 

     session.getTransaction().commit(); 
     session.close(); 
    } 
} 

事務提交時,Hibernate會在數據庫中刪除收集的數據,因爲原來的集合被替換爲一個新的後,但我不想休眠去做這個。有什麼辦法可以做到嗎?

+0

你沒有顯示一些級聯映射嗎? – Bozho

+0

沒有級聯的集合 – Hebing

回答

0

這意味着你只想爲學生添加一些課程。所以,你應該只添加新的課程,學生的exisitng courses列表,而不是一個新的列表替換它:

List newCourses = new ArrayList(); 
newCourses.add(...); 

/*** Add a list of new course instead of replacing with a new list***/ 
s.addCourse(newCourses); 

addCourse(List courseList)是學生的方法,將輸入列表courseList的所有元素添加到學生的內部courses名單。

+0

因爲它是一個遺留系統,它之前使用了OJB,並且有很多地方像:s.setCourses(newCourses);在系統中。現在我正在從OJB遷移到Hibernate,我不想改變所有這些地方,因爲它是一項很大的工作。 – Hebing

+0

老實說,我不認爲hibernate在映射或配置xml中有這樣的設置,因爲它違反了hibernate的設計原則,hibernate首先跟蹤內存中實體的狀態並延遲向數據庫發出SQL儘可能遲到沖洗過程。如果你真的從項目中刪除集合,它將最終從DB中刪除。所以,我不認爲你可以在不修改任何代碼的情況下得到你想要的結果。 –