本帖最后由 binbb521 于 2012-12-04 11:48:29 编辑

解决方案 »

  1.   

    楼主为何要用hibernateCallBack
    直接用getHibernateTemplate().find(String query,Object... values)
      

  2.   

    测试过了,用find也是这种情况
      

  3.   

     ZqAdminPermission zqAdminPermission = getHibernateTemplate().execute(new HibernateCallback<ZqAdminPermission>() { 
    这个
    HibernateTemplate执行execute(new HibernateCallback())方法,从HibernateCallback中得到session,在此session中做多个操作,并希望这些操作位于同一个事务中。
     回调实际就是一种事件触发模式,就象连环地雷一样,一旦触发一个,这个再触发另外一个,你在find这个方法被执行时,希望同时执行其他方法,就需要回调。
    楼主不需要执行多个方法就不用加这个回调的东西了吧!
      

  4.   

    我现在把代码改成public ZqAdminPermission findById(final String id) {
    String queryString="from ZqAdminPermission zap left join fetch zap.zqAdminModuleses where zap.adminPermissionId=?";
    List list = getHibernateTemplate().find(queryString,id);
    if(list.size()==0) return null;
    return (ZqAdminPermission)list.get(0);
    }依然是查询数据时就把数据删了。。
      

  5.   


    1. 检查一下你的连接是不是走的删除的方法。
    2. debug一下你这个action的处理的地方。
      

  6.   

    不是走的删除方法
    一直是跟断点走的,走一步看一下数据库,就在find()方法执行完查询后,数据被删除的
      

  7.   


        public ZqAdminPermission findById(String id) {
       try {
       String hql = "from ZqAdminPermission zap where zap.adminPermissionId='"+id+"'"; 
       logger.debug("hql:"+hql);
       List<ZqAdminPermission> list=this.getHibernateTemplate().find(hql);
       if(list.size()>0){
       return list.get(0);
       }
       } catch (Exception e) {
       throw new DataException(e.toString(), null);
       }
       return null;
       }
    不要看数据库,看看你每行走的代码,就是跳转到实现类里面每一步也看一下。尤其是你查询中的每一行和你执行完后的操作。
    最好贴一下你action处理的方法!
      

  8.   


    public void findById(){
    ZqAdminPermission zqAdminPermission=zqAdminPermissionService.findById(adminPermissionId);
    ServletActionContext.getRequest().setAttribute("permission", zqAdminPermission);
    }action是这样的,很简单的,跳转到Service里面直接到DAO查的数据,中间没做任何处理步骤
      

  9.   

    真个代码根本就不报任何错,控制台不打印,页面也没显示,单独运行action也不出错,以前的代码都没什么问题,所以怀疑是映射的问题,您帮忙看下多对多映射那样写有没有什么问题呢?
      

  10.   


    我想的是:你走的是查询方法,跟删除根本没关系的吧,但是执行查询竟然将数据删除,这个是很神奇的事情啊!我想的是你走的链接是删除的方法或者是你调用方法的过程中调用成删除的了。映射这个东西是帮你获取数据的跟删除没什么关系的。
    还有一点:从你的sql语句来看用不到多对多什么的啊,最多是一对多的关系。
      

  11.   


    多对多的话,你中间表里面分别是另外两张关联表的主键,是不是总共这两个字段?如果是的话作为这张表的复合主键和复合外键,这个时候的这个关联表是不生成hibernate映射文件的。 你是不是还有这个关联表的映射文件呢?
      

  12.   


    楼主,把hibernate的配置信息发上来。
    hibernate.cfg.xml
    其中有项:<!--自动根据hbm生成ddl。-->
    <property name="hibernate.hbm2ddl.auto">update</property>你可能设置成:
    <property name="hibernate.hbm2ddl.auto">delete</property>
    也可能是设置在spring里面了。请楼主找出来然后把hibernate的配置信息贴出来。
    不是程序的问题。估计是hibernate设置出问题了。
      

  13.   

    如果存在这个设置:
    <property name="hibernate.hbm2ddl.auto">delete</property>
    那么直接删除就行。hbm2ddl.auto这个设置不要没关系的。
      

  14.   

    谢谢各位!问题解决了,只是实体类中的getset方法少了一个this.