Hibernate---inverse,cascade(3)

更新分支机构:

1、设置inverse=true cascade=none,更新代码如下:

session = HibernateSessionFactory.currentSession();
tx = session.beginTransaction();
BranchInfo branchInfo = (BranchInfo) session.load(BranchInfo.class, Long.valueOf(6));
branchInfo.setAddress("bj5");
Set<Seal> sealSet = new HashSet<Seal>();
Seal seal = new Seal();
seal.setSealData(null);
seal.setSealModels(null);
seal.setSealName("sealName7");
sealSet.add(seal);
branchInfo.setSealSet(sealSet);
session.save(branchInfo);
System.out.println("success_____________");
tx.commit();

发出如下sql语句:

Hibernate: update tbranchinfo set address=? where id=?

说明:

虽然重新设置了branchinfo关联的seal集合,但由于cascade=none,没有级联保存,

由于inverse=true,因此没有更新级联关系。

2、设置inverse=true cascade=save-update,测试代码不变,发出sql语句如下:
Hibernate: select max(id) from tseal
Hibernate: insert into tseal (sealName, id) values (?, ?)
Hibernate: update tbranchinfo set address=? where id=?

说明:

更新了branchinfo的address属性,由于设置cascade=save-update,

因此级联保存tseal表,由于inverse=true所以并没有维护关系

3、设置inverse=false cascade=none,发出sql语句如下:
Hibernate: update tseal set branchInfoId=null where branchInfoId=?
Hibernate: update tseal set branchInfoId=? where id=?

说明:
将原先的seal对象和branchInfo解除管理关系,并且更新新的seal和branch关联关系,但是由于

cascade=none所以没有将新seal插入表中因此在更新级联关系时报如下异常:
org.hibernate.TransientObjectException: object references an unsaved transient instance

4、设置inverse=false cascade=save-update发出sql语句如下:
Hibernate: select max(id) from tseal
Hibernate: insert into tseal (sealName, id) values (?, ?)
Hibernate: update tseal set branchInfoId=null where branchInfoId=?
Hibernate: update tseal set branchInfoId=? where id=?

将原先的seal对象和branchInfo解除管理关系,并且更新新的seal和branch关联关系

你可能感兴趣的:(Hibernate)