2010-01-08 145 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对象?如果您有两个会话实例,那么应该没有问题,除非您从两个会话中并行更新同一行,这会成为陈旧的对象问题。