2010-01-08 4 views
1

Я решил свою проблему, но я просто хочу лучше понять, как все работает.Спящий сеанс, отслеживающий объекты

Я перебираю коллекцию, создавая/инициализируя новый продукт, добавляя к ней свою коллекцию (отображаемую 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(); 
} 

Сейчас я получаю сообщение об ошибке о том, что другой объект с тем же идентификатором уже отслеживается, так что произошла ошибка дублирования происходит.

Я полагал, что это был объект категории, и на самом деле это была проблема, так что я сделал это:

Category c = null; 
forloop 
{ 

.. 

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

... 

} 

Так что теперь категория не загружается, если он не имеет другой идентификатор, и теперь моя программа работала хорошо.

Этот вопрос есть, есть ли другой способ сделать это?

Могу ли я заставить Hibernate прекратить отслеживать этот объект, чтобы я мог просто загрузить его, не беспокоясь об этих проблемах?

+0

Является ли ваш DAO тем же ISession, что и ваш итерирующий код выше? ISession - это UOW - Unit Of Work, и я чувствую, что у вас есть 2 единицы работы. – David

+0

Ну, мой DAO использует Session session = HibernateUtil.getSessionFactory(). GetCurrentSession(); Итак, я понял, что это была текущая сессия, но я не думаю? – mrblah

ответ

1

well Dao.GetById (b.categoryId); должен всегда возвращать объект Category с переданным id, как можно получить разные объекты категории? если у вас есть два экземпляра сеанса, тогда не должно быть проблем, если вы не будете параллельно обновлять одну и ту же строку из обоих сеансов, что будет проблемой устаревших объектов.

Смежные вопросы