收藏 分销(赏)

hibernate中inverse=true粗解.doc

上传人:仙人****88 文档编号:7862516 上传时间:2025-01-23 格式:DOC 页数:3 大小:31.50KB 下载积分:10 金币
下载 相关 举报
hibernate中inverse=true粗解.doc_第1页
第1页 / 共3页
hibernate中inverse=true粗解.doc_第2页
第2页 / 共3页


点击查看更多>>
资源描述
hibernate中inverse=true粗解 一个Person可以参加多个Event,一个Event有多个Person参加。 映射文件如下: <!-- Person.hbm.xml --> <hibernate-mapping package="events">   <class name="Person" table="person">       <id name="id" column="person_id">           <generator class="native"/>       </id>       <property name="age" length="0"/>       <property name="firstname"/>       <property name="lastname"/>       <set name="events" table="person_event">           <key column="person_id"/>           <many-to-many column="event_id" class="events.Event"/>       </set>   </class> </hibernate-mapping> <!-- Event.hbm.xml --> <hibernate-mapping>   <class name="events.Event" table="events">       <id name="id" column="event_id">             <generator class="native"/>       </id>       <property name="date" column="events_date" type="timestamp"/>       <property name="title" column="events_title"/>       <set name="participants" table="person_event" inverse="true">           <key column="event_id"/>           <many-to-many column="person_id" class="events.Person"/>       </set>   </class> </hibernate-mapping> inverse=true的含义: 由双向关联另一方维护该关联,己方不维护该关联(只能进行查询操作)。在上述代码中,由Person方维护该<many-to-many>关系,示例代码如下(以向Person参与的Event中加入新的Event为例):         Session session = HibernateUtil.getSessionFactory().getCurrentSession();         session.beginTransaction();         Person p = (Person) session.load(Person.class, personId);         Event e = (Event) session.load(Event.class, eventId);         p.getEvents().add(e);//执行该代码时,hibernate会向中间表 person_event中插入person_id和event_id记录,如果换成e.getParticipants().add(p)的话,该代码将不会被执行,即hibernate不会向表person_event中插入记录。         session.getTransaction().commit(); 要注意的一点:在双向关联的关系中,映射的column(和table)的值要一致(即要用相同的表名和列名),不然设置为inverse="true"的这方将失去这个双向关系,而变成了一个单向关联。.3 学者经常混淆inverse和cascade。实际上,这是两个互不相关的概念。 inverse指的是关联关系的控制方向,而cascade指的是层级之间的连锁操作。 我是在部署数据的双向一对多的时候想到的下面这些: 1。主控只能有一个: 首先inverse决定主控与被控的关系,这里要注意只能是一边控制另一边, 因为如果是互相控制的话就会造成死循环。(谁都不控制你还要orm干啥。。。) 2。cascade字段仅在主控方有效力: 然后cascade(关联操作)只在主控方才有效,被控方即使设了cascade也没用。 也就是是由主控方来维护的cascade操作。 3。双向关联在关联操作上的控制还是单向: 所以双向关联只是在映射文件上有互相关联的关系,而在操作上还是单向的。 我们引入双向关联只是为了将主控权交给多方,来提高性能(这一点我后面解释) ,并可以避免约束违例(外键null的问题)。 4。都是单向控制,多方控制时却要使用双向关联的原因: 写到这里的时候我自己也产生了另一个疑问,只是主控权的问题嘛,完全可以将像 one-to-many那样把inverse设为false就获得主控权了嘛。难道是设计的错误? 经过核实我发现原来many-to-one原来没有inverse字段,所以只能通过设置one-to-many的 inverse字段间接使多方获得主控权。 5。多方控制效率高:(这点是我个人理解) 多方只对应一个单方,级联操作的时候,相关项少,操作快。 而单方对应多个多方,级联操作,相关项多,操作慢。 但我仍然有一个问题: 现在主要的问题为什么要这样设计?而不能在many-to-one中直接提供inverse字段,使多方获得主控权。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 小学其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服