1、hibernate中inverse=true粗解
一个Person可以参加多个Event,一个Event有多个Person参加。
映射文件如下:
2、length="0"/>
4、
inverse=true的含义: 由双向关联另一方维护该关联,己方不维护该关联(只能进行查询操作)。在上述代码中,由Person方维护该关
5、系,示例代码如下(以向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.
6、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
7、
学者经常混淆inverse和cascade。实际上,这是两个互不相关的概念。
inverse指的是关联关系的控制方向,而cascade指的是层级之间的连锁操作。
我是在部署数据的双向一对多的时候想到的下面这些:
1。主控只能有一个:
首先inverse决定主控与被控的关系,这里要注意只能是一边控制另一边,
因为如果是互相控制的话就会造成死循环。(谁都不控制你还要orm干啥。。。)
2。cascade字段仅在主控方有效力:
然后cascade(关联操作)只在主控方才有效,被控方即使设了cascade也没用。
也就是是由
8、主控方来维护的cascade操作。
3。双向关联在关联操作上的控制还是单向:
所以双向关联只是在映射文件上有互相关联的关系,而在操作上还是单向的。
我们引入双向关联只是为了将主控权交给多方,来提高性能(这一点我后面解释)
,并可以避免约束违例(外键null的问题)。
4。都是单向控制,多方控制时却要使用双向关联的原因:
写到这里的时候我自己也产生了另一个疑问,只是主控权的问题嘛,完全可以将像
one-to-many那样把inverse设为false就获得主控权了嘛。难道是设计的错误?
经过核实我发现原来many-to-one原来没有inverse字段,所以只能通过设置one-to-many的
inverse字段间接使多方获得主控权。
5。多方控制效率高:(这点是我个人理解)
多方只对应一个单方,级联操作的时候,相关项少,操作快。
而单方对应多个多方,级联操作,相关项多,操作慢。
但我仍然有一个问题:
现在主要的问题为什么要这样设计?而不能在many-to-one中直接提供inverse字段,使多方获得主控权。