hibernate 如何进行连接表(中间表)查询与更新

问题描述

小弟不才,特来请教!现有三张表,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的数据库操作不一样,但目的都是一个:维护数据的一致性。

时间: 2024-07-29 05:17:40

hibernate 如何进行连接表(中间表)查询与更新的相关文章

hibernate HQL new xxx() 查询 join连接多个表,并把连接后的表保存到一个新类中

hibernate HQL  new xxx() 查询 join连接多个表,并把连接后的表保存到一个新类中 另外  保存一些字段可以这样 select new com.zrj.entity.BankSelect(bankNum,bankName)from BankInfo as bank where 1=1

c# 数据库表连接查询-C#代码中查询数据库查询两个连接起来的表怎么获取数据并把数据放到DataSet中?

问题描述 C#代码中查询数据库查询两个连接起来的表怎么获取数据并把数据放到DataSet中? 以下是获取所有信息的代码函数: public static DataSet GetAllInfos() { string sql = "select InfoID,InfoTitle,InfoTime,InfoContent,i.AccountID,a.AccountName from Info as i inner join Account as a on i.AccountID = a.Accoun

外连接 三张表-ORACLE-包含外连接的三表查询

问题描述 ORACLE-包含外连接的三表查询 select r.msg_ids.contentr.file_id from msg_rcv r left join msg_send s left join upload_file f on r.user_id = '210000000004843' and r.msg_id = s.msg_id and r.file_id = f.id 上面的SELECT语句,执行的时候报"ORA-00905:缺失关键字错误",请问应该如何修改? ms

大神帮帮忙-ssh中2个表联合hql查询流程问题

问题描述 ssh中2个表联合hql查询流程问题 我的hql语句是用Guide 和UserGuide这两个表进行连接查询结果,执行hql后用Guide接收其返回值,那么我需要在Guide实体类中将UserGuide实体类做为属性引入,是不是这样的流程,还有没有其他要注意的.最好有一些代码让我参考参考. 解决方案 你这样也行. 你要做两表联查,也可以根据外键,来用hql语句查询到数据.其实查询数据有很多种方法,你觉得哪一种你熟悉,或者性能好,或者你感觉方便,你就可以 使用哪一种,看需求就行了.我推荐

解析mysql中:单表distinct、多表group by查询去除重复记录

单表的唯一查询用:distinct 多表的唯一查询用:group bydistinct 查询多表时,left join 还有效,全连接无效, 在 使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用 它来返回不重复记录的条数,而不是用它来返回不重复记录的所有值.其原因是distinct只能返回它的目标字段,而无法返回其它字段,用 distinct不能解决的话,我只有用二重循环查询来解决,而这样对于一个数据

oracle-Oracle中两个表连表查询,怎么实现?

问题描述 Oracle中两个表连表查询,怎么实现? 表1. 表2. 结果1. 结果2. 现在有两张表,表1和表2,写 sql 语句,查询出 结果1或结果2. 表1中,org_code唯一.并且不存在重复项,结果中要查出来全部表1的数据 解决方案 select * from a left join b on a.org_code = b.org_code where b.version_no is null or b.version_no='1'; 自己写的,这个可以用,不知道还有没有别的办法??

hibernate的关联关系,是否数据库表中有外键没有关系?

问题描述 hibernate的关联关系,是否数据库表中有外键没有关系? hibernate的关联关系,是否数据库表中有外键没有关系?昨天使用了hibernate做了一个多对一的关系,然后在做数据库字段的时候,一开始并没有去建立外键约束,只是把关联字段的信息放了上去,然后CRUD操作都没问题,然后看了一篇帖子,上面看到数据库表中有外键约束,这时候才想起来这个事情,我加了外键以后也没什么问题,再去掉还是没有问题,那么这里是加还是不加外键呢?hibernate自己处理好了吗?有什么区别吗?以后是加好还

sql-如何将数据库表的两张表进行合并查询

问题描述 如何将数据库表的两张表进行合并查询 有两张表,数据列均不一样,要将两张表的数据合并到一起,想应的sql怎么拼接呢?求大神解答,不胜感激! 解决方案 你想怎么合并? 如果是按照关系合并,可以这么写 select a.*, b.* from a join b on a.id = b.aid 如果是数据合并(假设两个表都有 相同列1 相同列2 两个字段),那么可以这样 select a.相同列1, a.相同列2 from a union select b.相同列1, b.相同列2 from

SSH组合开发中,Hibernate中,主表与从表数据更新

问题描述 SSH组合开发中,Hibernate中,主表与从表数据更新 在Hibernate中,我需要更新一条主表的数据,但同时更新多条从表的数据!我最初的构思是,用主表PO类中的Set从表集合,与从jsp中获取的更新从表数据相对比,相同的删除,不相同的添加,同时,把Set集合中的数据相同的留下,不相同的删除. 这是代码: /* * 先查询一条商品属性表的信息 * 将Vo转换为Po * 根据vo类中的ProductCategoryid字段查询需要查询一个商品类型表(CyProductCategor

hibernate 根据持久化类 创建数据库表的时候出现的错误如下,请大神帮忙解决?

问题描述 hibernate 根据持久化类 创建数据库表的时候出现的错误如下,请大神帮忙解决? 十二月 09, 2015 1:49:52 下午 org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata 信息: table not found: DIC_TAB 十二月 09, 2015 1:49:52 下午 org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata 信息: