我解决了我的问题,但我只想更好地了解事情是如何运作的。
我正在循环一个集合,创建/初始化一个新产品,在其集合中添加一个类别(映射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 :(得分:1)
好Dao.GetById(b.categoryId);应该总是返回那些带有传递id的Category对象,如何获得不同的Category对象?如果你有两个会话实例,那么除非你从两个会话中并行更新同一行,否则应该没有问题。这将是一个陈旧的对象问题。