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停止跟踪该对象,所以我可以加载它而不必担心这些问题?
您的DAO是否使用与上述迭代代码相同的ISession? ISession是一个UOW - 工作单元,我有一种感觉,你有2个工作单元正在进行。 – David 2010-01-08 20:40:01
我的DAO使用Session session = HibernateUtil.getSessionFactory()。getCurrentSession(); 所以我认为这是本届会议,但我猜不是? – mrblah 2010-01-08 21:12:23