举个最简单的一对多父子关系。那么代码就写成:html
Parent p = new Parent(); Child c = new Child(); c.setParent(p); //维护父子之间关系 p.getChildren().add(c); session.save(p); session.flush();映射文件配置:
父亲中的关系映射 {set name="children" lazy="true" inverse="true"} {key column="parent_id"/} {one-to-many class="test.Child"/} {/set} 儿子中关系映射 {many-to-one name="parent" column="parent_id" not-null="true"/}
set中inverse="true",说明父子关系只在多的一端(Child)维护。因此只会发出2个insert语句。java
注意:{many-to-one}老是设成“inverse=false”的,并且这个属性在Mapping中是不存在的!sql
这样运行的下来的结果就是:Hibernate: insert into parent (id) values (?) Hibernate: insert into child (parent_id, id) values (?, ?)
若是将set中的inverse设为true,那么会发出3条sql语句,前2条是insert语句,后1条是update语句用来维护parent和child类的父子关系。数据库
固然,假如c.setParent(p)注释掉(破坏了父子关系),结果就变成了:session
Hibernate: insert into parent (id) values (?)
===================================================
(实例2):
一个Person能够参加多个Event,一个Event有多个Person参加。映射文件以下:
app
<!-- 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>
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();
Inverse:负责控制关系,默认为false,也就是关系的两端都能控制,但这样会形成一些问题,更新的时候会由于两端都控制关系,因而重复更新。通常来讲有一端要设为true。spa
Cascade:负责控制关联对象的级联操做,包括更新、删除等,也就是说对一个对象进行更新、删除时,其它对象也受影响,好比我删除一个对象,那么跟它是多对一关系的对象也所有被删除。
举例说明区别:删除“一”那一端一个对象O的时候,若是“多”的那一端的Inverse设为true,则把“多”的那一端全部与O相关联的对象外键清空;若是“多”的那一端的Cascade设为Delete,则把“多”的那一端全部与O相关联的对象所有删除。hibernate
版权声明:本文为博主原创文章,未经博主容许不得转载。code