Hibernate---inverse,cascade(3)

来源:互联网 发布:炉石退环境知乎 编辑:程序博客网 时间:2024/06/06 01:48

更新分支机构:

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关联关系