【问题标题】:Hibernate session keeping track of objects休眠会话跟踪对象
【发布时间】: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


【解决方案1】:

好吧 Dao.GetById(b.categoryId);应该总是返回那些带有传递 id 的 Category 对象,怎么可能得到不同的 Category 对象呢?如果您有两个会话实例,那么应该不会有问题,除非您从两个会话中并行更新同一行,这将是一个过时的对象问题。

【讨论】:

    猜你喜欢
    • 2014-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 2012-06-02
    • 2015-06-12
    • 1970-01-01
    相关资源
    最近更新 更多