使用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);

解决方案 »

  1.   

    猜测是事务提交问题。但是如果是因为事务提交的延迟,那么就应该只能删除最后一条记录。但是事实却是只能删除第一条。
    并且有个比较明显的特征:不管for循环多少次,执行的SQL语句都只发出了一条。且也只删除了第一条记录。想不出为什么。各位大大。给力点吧。我会加分的!
      

  2.   

    会不会是级联删除的问题 role有没有和别的关联
      

  3.   

    我们这次数据库中表之间无任何关联。bool = this.userGroupService.delUserRole(role);这一段代码就是因为没有级联所以手动进行关联删除的。
      

  4.   

    你为什么有2次删除:
    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)
      

  5.   

    应该是:role = this.roleDao.getRoleByRoleId(Long.valueOf(prIds[i]));(通过roleId来获取一个role)
      

  6.   

    bool = this.roleDao.delRole(role);
    bool = this.userGroupService.delUserRole(role);
    这两句分别为删除角色本身和删除用户组中的角色。
    nxd395239299,你说并不是你把一个ID设置给这个对象,这个对象就改变了。这个我知道。我只是认为。如果delete是马上执行,那么也就意味着一次循环删除一次。删除后session关闭。那么这个对象就已经是临时状态了。我在修改它的ID继续删除。这样应该没错的吧?或者 你指的:"你说并不是你把一个ID设置给这个对象,这个对象就改变了。"这句话 有别的什么含义。请明示啊! 谢谢!
      

  7.   

    为什么不能是同一个对象?请明示呀。谢谢执行顺序?请问你是说for循环的循环会乱跳么?
      

  8.   

    为什么不能是同一对象...请参看HIBERNATE基础...看看什么是对象映射
    不管是删除还是更新,你都要考虑持久态的POJO
      

  9.   


    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方法,这样操作有利于事务处理!
      

  10.   

    持久态对象。我假设如果每次都能顺利的删除给定对象,那么我在下一次获得的应该是瞬时对象,因为此时该对象OID标识符在数据库中没有对应一条记录。不知这种说法是否正确。如果没错,我想知道为什么只能删除第一条。
      

  11.   

    谢谢!应该是这个问题。我一直以为,Hibernate只以OID来区分对象的不同。请问能详细点么?拜托啦
      

  12.   

    要么直接将id 数组传入 DAO 用SQL 循环删除
    要么在DAO层 将id数组的对象先get到 然后用deleteAll将得到的数据集合 删除
    顺便说下 你的代码问题很多 
    2个数据库操作 一个在try里 一个在外面 我不知道你的事务是配置在那一层
    那个 bool值 的赋值 如果 第一个删除失败 但是try的删除成功 那你 一直都是成功
      

  13.   

    对象没有变,ID只是对象的一个属性,你该变了ID并不能改变这个对象,这个对象对应的还是你刚才删除的数据库里的记录.
    HibernateTemplate.delete(Object entity);
    这个方法不是根据ID来删除数据库的记录,是根据实体entity来删除的!
      

  14.   

    你哪里删除对象了?
    你只是调用了一个delete方法,并且把POJO传进去了而已...
    这和删除对象完全是两个概念...
    对象是对象,你仅仅在改变这个对象上的一个属性而已
      

  15.   

    role是你参数传过来的一个对象引用,不是真实的对象,你set他的ID只是改变了该对象引用所指的真实对象中的属性值,对象引用地址并没有改变。所以删除的只有第一个对象记录。
    要像你这样实现的话放开你的注释代码,这样每次对象都不同 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();
      

  16.   


    role.setReId(Long.valueOf(prIds[i]));
    bool = this.roleDao.delRole(role);
    这种方法不对吧
    删除应该先从数据库获取到这个对象之后再执行删除
      

  17.   

    我觉得应该先通过roleDao.getRole(Long.valueOf(prIds[i])),先取到这个role后,再roleDao.delRole(role),将这个role删除
      

  18.   

    那段代码是在Dao层的,我事务配置的是Service层。这样如果出现异常,事务马上就会回滚。根据我的理解。如果前面的操作出现异常、删除失败。那么就不会继续往下执行了,不知道这样实现对否?