Я решил свою проблему, но я просто хочу лучше понять, как все работает.Спящий сеанс, отслеживающий объекты
Я перебираю коллекцию, создавая/инициализируя новый продукт, добавляя к ней свою коллекцию (отображаемую 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 прекратить отслеживать этот объект, чтобы я мог просто загрузить его, не беспокоясь об этих проблемах?
Является ли ваш DAO тем же ISession, что и ваш итерирующий код выше? ISession - это UOW - Unit Of Work, и я чувствую, что у вас есть 2 единицы работы. – David
Ну, мой DAO использует Session session = HibernateUtil.getSessionFactory(). GetCurrentSession(); Итак, я понял, что это была текущая сессия, но я не думаю? – mrblah