单向一对多:
在一的一端 实体内加一个set
映射文件中加入
<set name="users"> <key column="groupid"/> <one-to-many class="User" /> </set>
这样写,需要先将多的一端保存,再保存一的一端,然后更新多的一端的外键:
sql:
Hibernate: insert into t_user (name, password, content) values (?, ?, ?)
Hibernate: insert into t_group (name) values (?)
Hibernate: update t_user set groupid=? where id=?
如果在set标签内加入级联:cascade="all"
这样不用单独保存多的一端,在保存一端的时候会级联保存多的实体。
sql:
Hibernate: insert into t_group (name) values (?)
Hibernate: insert into t_user (name, password, content) values (?, ?, ?)
Hibernate: update t_user set groupid=? where id=?
这样都会执行更新语句较麻烦
双向一对多:
在一的一端,同 单向一对多的一
在多的一端,实体,加入一个“一”的实体
映射文件加入:<many-to-one name="groupid" class="Group" />
sql:
Hibernate: insert into t_group (name) values (?)
Hibernate: insert into t_user (name, password, content) values (?, ?, ?)
Hibernate: update t_user set groupid=? where id=?
在一的一端 加入反转控制: inverse="true"
sql:
Hibernate: insert into t_group (name) values (?)
Hibernate: insert into t_user (name, password, content, groupid) values (?, ?, ?, ?)
引自其它资料:
关于inverse属性:
inverse主要用在一对多和多对多双向关联上,inverse可以被设置到集合标签<set>上,
默认inverse为false,所以我们可以从”一“一端和”多“一端维护关联关系,
如果设置成inverse为true,则我们只能从多一端来维护关联关系
inverse和cascade
* inverse是关联关系的控制方向
* cascade操作上的连锁反应