2010-01-08 101 views
1

我解決了我的問題,但我只是想更好地理解事情是如何工作的。Hibernate會話跟蹤對象

我正在循環訪問一個集合,創建/初始化一個新產品,向它的集合添加一個類別(映射爲m:m),然後保存並提交事務。

for(Blah b : blahs) 
{ 
    session = getcurrensession(); 

    Product p = new Product(1,2,3,4,5); 



    Category c = Dao.GetById(b.categoryId); 

    session.beginTransaction(); 

    p.getCategories().add(c); 
    session.save(p); 

    session.gettransaction.commit(); 
} 

現在我得到一個錯誤,指出有相同ID的另一個對象已被跟蹤,因此出現了重複錯誤怎麼回事。

我想這是該類別的對象,實際上這就是問題所在,所以我這樣做:

Category c = null; 
forloop 
{ 

.. 

    if(c == null || c.getId() != b.categoryId) 
     c = Dao.GetById(b.categoryId); 

... 

} 

所以現在沒有加載類,除非它有不同的ID,現在我的計劃工作精細。

這個問題是,是否有另一種方法來做到這一點?

我可以強制Hibernate停止跟蹤該對象,所以我可以加載它而不必擔心這些問題?

+0

您的DAO是否使用與上述迭代代碼相同的ISession? ISession是一個UOW - 工作單元,我有一種感覺,你有2個工作單元正在進行。 – David 2010-01-08 20:40:01

+0

我的DAO使用Session session = HibernateUtil.getSessionFactory()。getCurrentSession(); 所以我認爲這是本屆會議,但我猜不是? – mrblah 2010-01-08 21:12:23

回答

1

well Dao.GetById(b.categoryId);應該總是返回那些帶有傳遞id的Category對象,如何獲得不同的Category對象?如果您有兩個會話實例,那麼應該沒有問題,除非您從兩個會話中並行更新同一行,這會成爲陳舊的對象問題。