论坛首页 Java企业应用论坛

hibernate入门篇之新增功能_4:many-to-many

浏览 39997 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-01-15  
我测试了以下不要inverse="true"也可以,但是
work.getAuthors().add(author);
author.getWorks().add(work);
只要其一旧可以了
0 请登录后投票
   发表时间:2004-01-15  
引用
work.getAuthors().add(author);
author.getWorks().add(work);
只要其一旧可以了

这样会导致两边的数据不一致的,
比如你只调用了work.getAuthors().add(author); ,这样虽然可以正确地更新数据库,但如果你在同一个session中或者下一个session(对author.works设置了cache时)对相应的author调用author.getWorks()会发现那个work并没有加入!

双向关联时应该始终两边一起更新。
0 请登录后投票
   发表时间:2004-01-16  
如果设了以一边inverse="true' 宾且 cascade="all"的话,不维护关系的一边将无法删除,始终会违反外键关系。所以我个人认为多对多不能设置inverse="true'
0 请登录后投票
   发表时间:2004-01-16  
如果设了以一边inverse="true' 宾且 cascade="all"的话

在绝大多数(100%?)情况下,many-to-many的cascade都会设置为"save-update",
比如User和Role是many-to-many的,你不可能在删除一个Role时,把它的所有User都删除吧,反之也不可能。

双向的many-to-many维护起来确实比较麻烦,且效率可能比较低。
但我始终还是坚持一个原则:双向关联一定要一边设置为inverse="true",更新时两边一起更新。我从来没有遇到过违反外键的情况。
0 请登录后投票
   发表时间:2004-01-16  
但是如果加上inverse=true必然有一方会出现这样的问题: 本来可以a.add(1); a.add(2),a.add(3),现在非得写成a.get(1).add(a),a.get(2).add(a).....,显得有点累赘。
当然如你所说在有cache的时候会有问题
至于性能,这不同于一对多,多对一,应该没什么影响。
从关系本身来讲,一对多,多对一的关系本身都是由多的一方来维护的,
多对多是由双方来维护的
0 请登录后投票
   发表时间:2004-01-17  
设置为"save-update", 旧可以了
0 请登录后投票
   发表时间:2004-01-17  
你把删除的过程贴出来
0 请登录后投票
   发表时间:2004-01-18  
引用

但是如果加上inverse=true必然有一方会出现这样的问题: 本来可以a.add(1); a.add(2),a.add(3),现在非得写成a.get(1).add(a),a.get(2).add(a).....,显得有点累赘。

我看不懂你的意思:(


我在hibernate官方网站上提的一个问题
http://forum.hibernate.org/viewtopic.php?t=925551
0 请登录后投票
   发表时间:2004-01-19  
public static void modifyUserRole(String userId, String[] roleIds); throws 
        HibernateException { 
        Session session = null; 
        //session=openSession();; 

        User user = (User); session.load(User.class, userId);; 

        int max = roleIds.length; 
        Collection newRoles = new HashSet(max);; 
        for (int i = 0; i < max; i++); { 
            newRoles.add(session.load(Role.class, roleIds[i]););; 
        } 
        //---------------------------------------------------------------------- 
        for (Iterator iter = user.getRoles();.iterator();; iter.hasNext();; ); { 
            Role r = (Role); iter.next();; 
            if (!newRoles.contains(r);); { 
                r.removeUser(user);; 
            } 
        } 

        for (Iterator iter = newRoles.iterator();; iter.hasNext();; ); { 
            ( (Role); iter.next(););.addUser(user);; 
        } 
        //---------------------------------------------------------------------- 
} 

至于你的例字:我认为如果双向维护关系的话
       for (Iterator iter = newRoles.iterator();; iter.hasNext();; ); { 
            ( (Role); iter.next(););.addUser(user);; 
        } 


可以不要(当然不用cache的情况下)原应如下:
1) role 对象 在这个方法后就不在使用了,所以即使不同部也不要紧;(在大部分情况下,关系的两端的实例都局限在同一个方法内)在这种情况下双向维护关系比较方法
0 请登录后投票
   发表时间:2004-02-23  
如果Author中没有Works的Set,那么这种many-to-many的关系如何通过Work来查找某个author的Work的Set?(原有的model中没有,也觉得没有必要添加:一般情况下无需使用Author.getWorks的Set)

也就是所有的getAuthors中存在给定author的Work都应在结果集合中?这个查询如何写?
谢谢!
0 请登录后投票
论坛首页 Java企业应用版

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