单向关联 :当使用单向关联时,由父类管理关联关系,子类无法管理,而这时,父亲知道自己 的儿子,但是,从儿子对象不知道父亲是谁。单向关联时,只指定<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 (?)
<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 (?)