问题描述
小弟不才,特来请教!现有三张表,userroleuser_role(中间表)+---------+-------------+----------+--------+----------+|user_id|description|password|status|username|+---------+-------------+----------+--------+----------+|1||admin|1|admin||2||user|1|user||3||user|1|lml|+---------+-------------+----------+--------+----------+3rowsinset(0.08sec)mysql>select*fromrole;+---------+----------------+------------+|role_id|authentication|name|+---------+----------------+------------+|1||ROLE_ADMIN||2||ROLE_USER|+---------+----------------+------------+2rowsinset(0.06sec)mysql>select*fromuser_role;+---------+---------+|user_id|role_id|+---------+---------+|1|1||1|2||2|2|+---------+---------+这三张表是通过hibernate自动形成的,映射关系我是放在user表中,采用注解@many2many形式,现在我有两个想法,1、是在添加新用户时,就自动更新中间表(user_role)2、是想通过查询user中的id,来查询user_role中的role_id谢谢!!
解决方案
解决方案二:
该回复于2011-02-12 17:24:26被版主删除
解决方案三:
“set的inverse属性决定是否把对set的改动反映到数据库中去。inverse=false————反映;inverse=true————不反映”inverse属性默认为falseinverse属性默认是false的,就是说关系的两端都来维护关系。这个意思就是说,如有一个Student,Teacher和TeacherStudent表,Student和Teacher是多对多关系,这个关系由TeacherStudent这个表来表现。那么什么时候插入或删除TeacherStudent表中的记录来维护关系呢?在用hibernate时,我们不会显示的对TeacherStudent表做操作。对TeacherStudent的操作是hibernate帮我们做的。hibernate就是看hbm文件中指定的是"谁"维护关系,那个在插入或删除"谁"时,就会触发对关系表的操作。前提是"谁"这个对象已经知道这个关系了,就是说关系另一头的对象已经set或是add到"谁"这个对象里来了。前面说过inverse默认是false,就是关系的两端都维护关系,对其中任一个操作都会处发对表系表的操作。当在关系的一头,如Student中的bag或set中用了inverse="true"时,那就代表关系是由另一关维护的(Teacher)。就是说当这插入Student时,不会操作TeacherStudent表,即使Student已经知道了关系。只有当Teacher插入或删除时才会处发对关系表的操作。所以,当关系的两头都用inverse="true"是不对的,就会导致任何操作都不处发对关系表的操作。当两端都是inverse="false"或是default值时,在代码对关系显示的维护也是不对的,会导致在关系表中插入两次关系。在一对多关系中inverse就更有意义了。在多对多中,在哪端inverse="true"效果差不多(在效率上)。但是在一对多中,如果要一方维护关系,就会使在插入或是删除"一"方时去update"多"方的每一个与这个"一"的对象有关系的对象。而如果让"多"方面维护关系时就不会有update操作,因为关系就是在多方的对象中的,直指插入或是删除多方对象就行了。当然这时也要遍历"多"方的每一个对象显示的操作修关系的变化体现到DB中。不管怎样说,还是让"多"方维护关系更直观一些。(1)对one-to-many而言,改变set,会让hibernate执行一系列的update语句,不会delete/insert数据(2)对many-to-many而言,改变set,只修改关系表的数据,不会影响many-to-many的另一方。(3)虽然one-to-many和many-to-many的数据库操作不一样,但目的都是一个:维护数据的一致性。