Hibernate:如何在Hibernate中删除多行?

时间:2015-06-17 07:34:01

标签: java hibernate

我尝试使用 Hibernate 从数据库中删除多行。它成功完成了。

当我刷新.jsp页面时,将再次显示已删除的项目。

这是我的代码:

public int deleteUserById(String id[])
{
  SessionFactory sf = HibernateUtil.getSessionFactory();

  int flag = 0;

  User user;
  try
  {

    for (int i = 0; i < id.length; i++)
    {
      Session session = sf.openSession();
      session.beginTransaction();

      Long Id = Long.parseLong(id[i]);

      user = new UserRepository().getUserByID(Id);

      session.delete(user);
      session.getTransaction().commit();
      session.close();

    }
    flag = 1;
  }
  catch (Exception e)
  {
    System.out.println("Error in deleteUserById=" + e);
  }
  return flag;
}

其他方法:

public User getUserByID(Long Id)
{
  SessionFactory sf = HibernateUtil.getSessionFactory();
  Session session = sf.openSession();
  session.beginTransaction();

  User user = null;

  try
  {
    user = (User) session.createQuery("from User where Id='" + Id + "'").list().get(0);
  }
  catch (Exception e)
  {
    System.out.println("Error in getUserByID=" + e);
  }

  session.close();
  return user;
}

获取用户方法:

public ArrayList<User> getAllUser()
{
  ArrayList<User> list_user = new ArrayList<User>();

  SessionFactory sf = HibernateUtil.getSessionFactory();

  Session session = sf.openSession();
  session.beginTransaction();

  try
  {
    list_user = (ArrayList<User>) session.createQuery("from User").list();
  }
  catch (Exception e)
  {
    System.out.println("Error in getAllUser=" + e);
  }

  session.close();
  return list_user;
}

我曾使用session.clear(),但这并没有解决问题。

想法?

1 个答案:

答案 0 :(得分:3)

在getUserByID中获取的用户在其自己的会话中被查询,该会话已关闭,并且已分离用户返回。每个请求应该有一个会话,但是您有嵌套会话。

尝试在请求开头打开会话和事务 并在最后提交交易并最终关闭会话。

如果你真的想使用它自己的会话进行查询,那么你必须合并分离的结果:

   user = session.merge(new UserRepository().getUserByID(Id));

注意:您在“deleteUserById”中使用for循环中的许多会话和事务....这将耗费相当资源...更好地打开会话和周围的事务那个循环。