该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-01-15
我测试了以下不要inverse="true"也可以,但是
work.getAuthors().add(author); author.getWorks().add(work); 只要其一旧可以了 |
|
返回顶楼 | |
发表时间:2004-01-15
引用 work.getAuthors().add(author);
author.getWorks().add(work); 只要其一旧可以了 这样会导致两边的数据不一致的, 比如你只调用了work.getAuthors().add(author); ,这样虽然可以正确地更新数据库,但如果你在同一个session中或者下一个session(对author.works设置了cache时)对相应的author调用author.getWorks()会发现那个work并没有加入! 双向关联时应该始终两边一起更新。 |
|
返回顶楼 | |
发表时间:2004-01-16
如果设了以一边inverse="true' 宾且 cascade="all"的话,不维护关系的一边将无法删除,始终会违反外键关系。所以我个人认为多对多不能设置inverse="true'
|
|
返回顶楼 | |
发表时间: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",更新时两边一起更新。我从来没有遇到过违反外键的情况。 |
|
返回顶楼 | |
发表时间: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的时候会有问题 至于性能,这不同于一对多,多对一,应该没什么影响。 从关系本身来讲,一对多,多对一的关系本身都是由多的一方来维护的, 多对多是由双方来维护的 |
|
返回顶楼 | |
发表时间:2004-01-17
设置为"save-update", 旧可以了
|
|
返回顶楼 | |
发表时间:2004-01-17
你把删除的过程贴出来
|
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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 对象 在这个方法后就不在使用了,所以即使不同部也不要紧;(在大部分情况下,关系的两端的实例都局限在同一个方法内)在这种情况下双向维护关系比较方法 |
|
返回顶楼 | |
发表时间:2004-02-23
如果Author中没有Works的Set,那么这种many-to-many的关系如何通过Work来查找某个author的Work的Set?(原有的model中没有,也觉得没有必要添加:一般情况下无需使用Author.getWorks的Set)
也就是所有的getAuthors中存在给定author的Work都应在结果集合中?这个查询如何写? 谢谢! |
|
返回顶楼 | |