论坛首页 Java企业应用论坛

many-to-many关系的增加和修改问题

浏览 7324 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-08-25  
表:role、role_funcs、funclist

所有的配置情况按robbin的方法
参照:http://www.hibernate.org.cn/viewtopic.php?t=8287一个简单的复合主键的做关联类的例子

增加、修改、删除 都能执行通过,并有正确结果,但以下情况会发生错误:

1、增加:

      Role role = new Role();
      FuncList funcList = new FuncList();
      role.setRoleId( (String) hmInfo.get("RoleId"));
      role.setRoleName( (String) hmInfo.get("RoleName"));
      role.setExplain( (String) hmInfo.get("Explain"));

      //同时增加Role_FuncList关系
      String[] funcNos = (String[]) hmInfo.get("FuncList");
      List actList = (List) hmInfo.get("ActList");
      for (int i = 0; i < funcNos.length; i++) {
        funcList = (FuncList) session.get(FuncList.class, funcNos[i]);
        role.assignFunc(funcList, (String) actList.get(i));
      }
      //保存角色,同时保存了Role_FuncList关系
      session.saveOrUpdate(role);
      tx.commit();

如果只增加role信息,不增加role_funcs,即String[] funsNos 为空数据
则tx.commit()错误

2、修改

      String roleId = (String) hmInfo.get("RoleId");
      Role role = (Role) session.get(Role.class, roleId);
      role.setRoleName( (String) hmInfo.get("RoleName"));
      role.setExplain( (String) hmInfo.get("Explain"));

      //同时维护Role_FuncList关系
      FuncList funcList = new FuncList();
      String[] funcNos = (String[]) hmInfo.get("FuncList");
      List actList = (List) hmInfo.get("ActList");
      Object[] roleFuncList = role.getRoleFuncs().toArray();
      for (int n = 0; n < roleFuncList.length; n++) {
        role.remvoeFunc( (RoleFuncList) roleFuncList[n]);
      }
      role.getRoleFuncs().clear(); //清除关系
      for (int i = 0; i < funcNos.length; i++) {
        funcList = (FuncList) session.get(FuncList.class, funcNos[i]);
        role.assignFunc(funcList, (String) actList.get(i));
      }
      //保存角色,同时保存了Role_FuncList关系
      session.saveOrUpdate(role);
      tx.commit();

如果修改的role信息,存在role_funcs关系数据,即String[] funsNos 不为空数据
则tx.commit()错误

两个截然相反的错误,请分析一下是哪里的问题
   发表时间:2005-08-25  
经过测试,增加方法中的错误 不是 问题,程序有点问题

但 修改方法中 问题依旧
0 请登录后投票
   发表时间:2005-08-25  
错误代码

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [org.freedom.power.entity.RoleFuncList#org.freedom.power.entity.RoleFuncListId@1827cbd]

很明显,Role_Func 表键值重复

不过,我已经全部remove了,并且使用了SaveOrUpdate,怎么还是出现键值重复????
0 请登录后投票
   发表时间:2005-08-25  
难道是配置问题????

role:

    <set name="RoleFuncs" inverse="true" lazy="true" cascade="all-delete-orphan">
      <key column="RoleId" />
      <one-to-many class="org.freedom.power.entity.RoleFuncList"/>
    </set>

funclist:

    <set name="RoleFuncs" inverse="true" lazy="true" cascade="all-delete-orphan">
      <key column="FuncNo" />
      <one-to-many class="org.freedom.power.entity.RoleFuncList"/>
    </set>

RoleFuncList:

    <composite-id name="id" class="org.freedom.power.entity.RoleFuncListId">
      <key-many-to-one name="Role" column="RoleId" class="org.freedom.power.entity.Role"/>
      <key-many-to-one name="FuncList" column="FuncNo" class="org.freedom.power.entity.FuncList"/>
    </composite-id>

实在找不出问题来
0 请登录后投票
   发表时间:2005-08-25  
for (int i = 0; i < funcNos.length; i++); {
  funcList = (FuncList); session.get(FuncList.class, funcNos[i]);;  
  role.assignFunc(funcList, (String); actList.get(i););;
} 


代码没问题, funcNos有重复的数据.

to OneFox:欠扁
0 请登录后投票
   发表时间:2005-08-26  
我单步跟踪过,funcNos绝对没有重复数据
0 请登录后投票
   发表时间:2005-08-26  
又一次被我搞定了,难道高手们真的不屑一顾????

修改方法:

把session.saveOrUpdate(role); 改为

session.merge(role); 就搞定了

我查了官方的user faq

I called saveOrUpdate() or update() and got a NonUniqueObjectException!

The session maintains a unique mapping between persistent identity and object instance, in order to help you avoid data aliasing problems. You cannot simultaneously attach two objects with the same class and identifier to the same session.

The best way to avoid any possibility of this exception is to always call saveOrUpdate() at the beginning of the transaction, when the session is empty.

In Hibernate3, you can try using the merge() operation, which does not reattach the passed instance.

高兴之余有些悲哀,robbin倡导hibernate,如果没有良好的支持工作,再好的东西,大家也只能敬而远之,只有充分了解它,才能促使她更好的发展,否则,只能剩下这里的几篇高谈阔论的理论文章了

这根我们做产品推广一个道理,谁会去买一个陌生的产品呢
0 请登录后投票
   发表时间:2005-08-26  
renzhm 写道
错误代码

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [org.freedom.power.entity.RoleFuncList#org.freedom.power.entity.RoleFuncListId@1827cbd]

很明显,Role_Func 表键值重复

不过,我已经全部remove了,并且使用了SaveOrUpdate,怎么还是出现键值重复????

根据我的经验,你操作的持久对象在当前session中已经存在有另一个相同id的,因此缺省情况hibernate不允许你用此对象的另一身份修改他,如果可以拿到此对象你可以先evict,再持久化你自己的对象,不过看到merge这一个功能更好用:)
0 请登录后投票
   发表时间:2005-12-09  
renzhm 写道
又一次被我搞定了,难道高手们真的不屑一顾????

修改方法:

把session.saveOrUpdate(role); 改为

session.merge(role); 就搞定了

我查了官方的user faq

I called saveOrUpdate() or update() and got a NonUniqueObjectException!

The session maintains a unique mapping between persistent identity and object instance, in order to help you avoid data aliasing problems. You cannot simultaneously attach two objects with the same class and identifier to the same session.

The best way to avoid any possibility of this exception is to always call saveOrUpdate() at the beginning of the transaction, when the session is empty.

In Hibernate3, you can try using the merge() operation, which does not reattach the passed instance.

高兴之余有些悲哀,robbin倡导hibernate,如果没有良好的支持工作,再好的东西,大家也只能敬而远之,只有充分了解它,才能促使她更好的发展,否则,只能剩下这里的几篇高谈阔论的理论文章了

这根我们做产品推广一个道理,谁会去买一个陌生的产品呢


想问一下,cascade是否也对应也改为merge ,否则原来saveOrUpdateCopy()也应该可以吧
0 请登录后投票
   发表时间:2007-03-08  
我在一对多种, 用getHibernateTemplate().merge(o)  代替 getHibernateTemplate().saveOrUpdate(o); 结果 修改父亲时,虽然成功了但所有儿子都被删除了 。


没改之前 报 NonUniqueObjectException: 异常。

郁闷
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics