【发布时间】:2010-01-08 20:22:38
【问题描述】:
我解决了我的问题,但我只是想更好地了解事情是如何运作的。
我正在循环一个集合,创建/初始化一个新产品,将一个类别添加到它的集合中(映射的 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 个工作单元。
-
好吧,我的 DAO 使用 Session session = HibernateUtil.getSessionFactory().getCurrentSession();所以我认为这是当前会话,但我猜不是?
标签: java hibernate session transactions