project

本文深入探讨了ORM中的单向和双向关联概念,详细解释了不同配置选项如cascade和inverse的作用及其实现效果,并通过实例展示了各种配置下数据持久化的具体行为。
单向关联 :当使用单向关联时,由父类管理关联关系,子类无法管理,而这时,父亲知道自己 的儿子,但是,从儿子对象不知道父亲是谁。单向关联时,只指定<one-to-many>
<set name="usageinfos" inverse="true" cascade="none">
<key>
<column name="cloudUser_id" not-null="false" />
</key>
<one-to-many class="com.huawei.cloud.permanence.model.Usageinfo" />
</set>
双向关联:关联关系的管理可以通过inverse指定,这时,儿子能清楚的知道自己的父亲是谁。 双向关联时,还要指定<many-to-one>
<many-to-one name="clouduser" cascade="none" class="com.huawei.cloud.permanence.model.Clouduser" fetch="join">
<column name="cloudUser_id" not-null="true" />
</many-to-one>

Cascade属性:控制进行级联操作 all : 所有情况下均进行关联操作。
none:所有情况下均不进行关联操作。这是默认值。
save-update:在执行save/update/saveOrUpdate时进行关联操作。
delete:在执行delete时进行关联操作

inverse:属性,运用于双向关联
FatherDao fatherDao = new FatherDao();
Father father = new Father("David");
Child child1 = new Child("David Junior One");
Child child2 = new Child("David Junior Two");
father.add(child1);
father.add(child2);
fatherDao.save(father);
1. 如果cascade="all"且inverse="false"时:
Hibernate: insert into father (name) values (?)
// cascade = 'all',所以进行级联操作
Hibernate: insert into child (name, fatherid) values (?, ?)
Hibernate: insert into child (name, fatherid) values (?, ?)
// inverse = 'false',由father来维护关系(可以看到这些操作是多余的)
Hibernate: update child set fatherid =? where ID=?
Hibernate: update child set fatherid =? where ID=?
2. 如果cascade = "none" 且 inverse = "false":
Hibernate: insert into father (name) values (?)
// inverse='false',所以更新关系
Hibernate: update child set fatherid =? where ID=?
// 但由于cascade='none',child并未插入数据库,导致如下exception
org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance
3. 如果cascade = "all" 且 inverse = "true"
Hibernate: insert into father (name) values (?)
// cascade='all',执行对child的插入
Hibernate: insert into child (name, fatherid) values (?, ?)
Hibernate: insert into child (name, fatherid) values (?, ?)
// 但由于inverse='true',所以未有对关系的维护。但由于一对多的关系中,关系本身在“多”方的表中。所以,无需更新关系。
4. 如果cascade = "none" 且 inverse = "true"
Hibernate: insert into father (name) values (?)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值