使用HibernateTemplate进行遍历批量删除时,发现只能删除第一条记录,后面的均无法删除。但是当遍历时都new一个对象时,该问题不会出现。本人菜鸟。忘大虾告之。public boolean delRole(SysRole role) {
boolean bool = false;
String[] prIds = role.getStrReId().split(";");
for(int i=0;i<prIds.length;i++){
//SysRole sysRole = new SysRole();
System.out.println(prIds[i]);
role.setReId(Long.valueOf(prIds[i]));
bool = this.roleDao.delRole(role);
try {
bool = this.userGroupService.delUserRole(role);
} catch (Exception e) {
e.printStackTrace();
}
}
return bool;
}调用的是HibernateTemplate.delete(Object entity);
boolean bool = false;
String[] prIds = role.getStrReId().split(";");
for(int i=0;i<prIds.length;i++){
//SysRole sysRole = new SysRole();
System.out.println(prIds[i]);
role.setReId(Long.valueOf(prIds[i]));
bool = this.roleDao.delRole(role);
try {
bool = this.userGroupService.delUserRole(role);
} catch (Exception e) {
e.printStackTrace();
}
}
return bool;
}调用的是HibernateTemplate.delete(Object entity);
并且有个比较明显的特征:不管for循环多少次,执行的SQL语句都只发出了一条。且也只删除了第一条记录。想不出为什么。各位大大。给力点吧。我会加分的!
bool = this.roleDao.delRole(role);
bool = this.userGroupService.delUserRole(role);而且每次删除的都是同一个对象?并不是你把一个ID设置给这个对象,这个对象就改变了
role.setReId(Long.valueOf(prIds[i]));
估计把上边的语句改成下边的就可以了:
role = this.roleDao.delRole(Long.valueOf(prIds[i]));(通过roleId来获取一个role)
bool = this.userGroupService.delUserRole(role);
这两句分别为删除角色本身和删除用户组中的角色。
nxd395239299,你说并不是你把一个ID设置给这个对象,这个对象就改变了。这个我知道。我只是认为。如果delete是马上执行,那么也就意味着一次循环删除一次。删除后session关闭。那么这个对象就已经是临时状态了。我在修改它的ID继续删除。这样应该没错的吧?或者 你指的:"你说并不是你把一个ID设置给这个对象,这个对象就改变了。"这句话 有别的什么含义。请明示啊! 谢谢!
不管是删除还是更新,你都要考虑持久态的POJO
public class Tes {
private Long l;
public Long getL() {
return l;
}public void setL(Long l) {
this.l = l;
}
}public static void main(String[] args)throws Exception {
Tes tes = new Tes();
tes.setL(1L);
System.out.println(tes.hashCode());
tes.setL(2L);
System.out.println(tes.hashCode());
}此处获取的都为同一hashCode 因为他们的内存地址是不变,指向同一对象,故删除方法hibernateTemplate认为传入的对象为第一次传入的role对象,对于你的删除方式可以采用级联删除,及批量删除hibernateTemplate有提供相应的批量删除方法batchDelete方法,这样操作有利于事务处理!
要么在DAO层 将id数组的对象先get到 然后用deleteAll将得到的数据集合 删除
顺便说下 你的代码问题很多
2个数据库操作 一个在try里 一个在外面 我不知道你的事务是配置在那一层
那个 bool值 的赋值 如果 第一个删除失败 但是try的删除成功 那你 一直都是成功
HibernateTemplate.delete(Object entity);
这个方法不是根据ID来删除数据库的记录,是根据实体entity来删除的!
你只是调用了一个delete方法,并且把POJO传进去了而已...
这和删除对象完全是两个概念...
对象是对象,你仅仅在改变这个对象上的一个属性而已
要像你这样实现的话放开你的注释代码,这样每次对象都不同 OK //SysRole sysRole = new SysRole();
System.out.println(prIds[i]);
role.setReId(Long.valueOf(prIds[i]));
bool = this.roleDao.delRole(sysRole);
try {
bool = this.userGroupService.delUserRole(sysRole);
} catch (Exception e) {
e.printStackTrace();
role.setReId(Long.valueOf(prIds[i]));
bool = this.roleDao.delRole(role);
这种方法不对吧
删除应该先从数据库获取到这个对象之后再执行删除