Hibernate会话跟踪对象

时间:2010-01-08 20:22:39

标签: java hibernate session transactions

我解决了我的问题,但我只想更好地了解事情是如何运作的。

我正在循环一个集合,创建/初始化一个新产品,在其集合中添加一个类别(映射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停止跟踪该对象,以便我可以加载它而无需担心这些问题?

1 个答案:

答案 0 :(得分:1)

好Dao.GetById(b.categoryId);应该总是返回那些带有传递id的Category对象,如何获得不同的Category对象?如果你有两个会话实例,那么除非你从两个会话中并行更新同一行,否则应该没有问题。这将是一个陈旧的对象问题。