我尝试使用 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()
,但这并没有解决问题。
想法?
答案 0 :(得分:3)
在getUserByID中获取的用户在其自己的会话中被查询,该会话已关闭,并且已分离用户返回。每个请求应该有一个会话,但是您有嵌套会话。
尝试在请求开头打开会话和事务 并在最后提交交易并最终关闭会话。
如果你真的想使用它自己的会话进行查询,那么你必须合并分离的结果:
user = session.merge(new UserRepository().getUserByID(Id));
注意:您在“deleteUserById”中使用for循环中的许多会话和事务....这将耗费相当资源...更好地打开会话和周围的事务那个循环。