`
san_yun
  • 浏览: 2652197 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

一个cascade笔记

阅读更多

在one-to-many设置中通常都是把many放设置位save-update,但这样会出现问题.

比如班级(Classlist)和班级公告(Notify)是一对多的关系

java 代码
  1. Session session = factory.openSession();   
  2.     Transaction tx= session.beginTransaction();   
  3.     Classlist c = (Classlist) session.load(Classlist.class, 25389l);   
  4.     Notify nofity =  new Notify();   
  5.     nofity.setClasslist(c);   
  6.     c.getNotify().add(nofity);   
  7.     nofity.setClasslist(c);   
  8.     session.save(nofity);   
  9.     tx.commit();   
  10.     session.close();  

执行的SQL语句:

sql 代码
  1. Hibernate: select classlist0_.id as id0_, classlist0_.className as className0_ from classlist classlist0_ where classlist0_.id=?   
  2. Hibernate: select notify0_.classlist_id as classlis7___, notify0_.id as id__, notify0_.id as id3_, notify0_.notify_type as notify_t2_3_, notify0_.title as title3_, notify0_.content as content3_, notify0_.accessory as accessory3_, notify0_.postDate as postDate3_, notify0_.classlist_id as classlis7_3_, notify0_.role_id as role_id3_, role1_.id as id0_, role1_.name as name0_, role1_.uri as uri0_, role1_.classlist_id as classlis4_0_, role1_.user_id as user_id0_, classlist2_.id as id1_, classlist2_.className as className1_, user3_.id as id2_, user3_.USER_TYPE as USER_TYPE2_, user3_.loginID as loginID2_, user3_.password as password2_, user3_.sex as sex2_, user3_.birthday as birthday2_, user3_.realName as realName2_, user3_.nickName as nickName2_, user3_.tel as tel2_, user3_.address as address2_, user3_.describ as describ2_, user3_.studentNumber as student12_2_ from notify notify0_ left outer join role role1_ on notify0_.role_id=role1_.id left outer join classlist classlist2_ on role1_.classlist_id=classlist2_.id left outer join users user3_ on role1_.user_id=user3_.id where notify0_.classlist_id=?   
  3. Hibernate: insert into notify (title, content, accessory, postDate, classlist_id, role_id, notify_type) values (?, ?, ?, ?, ?, ?, 'com.talent.domain.Notify')   

 

但如果是跨Session,情况就大不一样了.

 

java 代码
  1. Session session = factory.openSession();   
  2.         Transaction tx= session.beginTransaction();   
  3.         Classlist c = (Classlist) session.load(Classlist.class, 25389l);   
  4.         c.getNotify().iterator();   
  5.         tx.commit();   
  6.         session.close();   
  7.            
  8.         session = factory.openSession();   
  9.         tx= session.beginTransaction();   
  10.         Notify nofity =  new Notify();   
  11.         nofity.setClasslist(c);   
  12.         c.getNotify().add(nofity);   
  13.         nofity.setClasslist(c);   
  14.         session.save(nofity);   
  15.         tx.commit();   
  16.         session.close();  

 

sql 代码
  1. Hibernate: select classlist0_.id as id0_, classlist0_.className as className0_ from classlist classlist0_ where classlist0_.id=?   
  2. Hibernate: select notify0_.classlist_id as classlis7___, notify0_.id as id__, notify0_.id as id3_, notify0_.notify_type as notify_t2_3_, notify0_.title as title3_, notify0_.content as content3_, notify0_.accessory as accessory3_, notify0_.postDate as postDate3_, notify0_.classlist_id as classlis7_3_, notify0_.role_id as role_id3_, role1_.id as id0_, role1_.name as name0_, role1_.uri as uri0_, role1_.classlist_id as classlis4_0_, role1_.user_id as user_id0_, classlist2_.id as id1_, classlist2_.className as className1_, user3_.id as id2_, user3_.USER_TYPE as USER_TYPE2_, user3_.loginID as loginID2_, user3_.password as password2_, user3_.sex as sex2_, user3_.birthday as birthday2_, user3_.realName as realName2_, user3_.nickName as nickName2_, user3_.tel as tel2_, user3_.address as address2_, user3_.describ as describ2_, user3_.studentNumber as student12_2_ from notify notify0_ left outer join role role1_ on notify0_.role_id=role1_.id left outer join classlist classlist2_ on role1_.classlist_id=classlist2_.id left outer join users user3_ on role1_.user_id=user3_.id where notify0_.classlist_id=?   
  3. Hibernate: insert into notify (title, content, accessory, postDate, classlist_id, role_id, notify_type) values (?, ?, ?, ?, ?, ?, 'com.talent.domain.Notify')   
  4. Hibernate: update classlist set className=? where id=?   
  5. Hibernate: update notify set title=?, content=?, accessory=?, postDate=?, classlist_id=?, role_id=? where id=?   
  6. Hibernate: update notify set title=?, content=?, accessory=?, postDate=?, classlist_id=?, role_id=? where id=?   
  7. Hibernate: update notify set title=?, content=?, accessory=?, postDate=?, classlist_id=?, role_id=? where id=?   
  8. Hibernate: update notify set title=?, content=?, accessory=?, postDate=?, classlist_id=?, role_id=? where id=?   
  9. Hibernate: update notify set title=?, content=?, accessory=?, postDate=?, classlist_id=?, role_id=? where id=?  

为什么第二种情况会多了这么多UPDATE呢?

1.因为在classlist被第一个session关闭,classlist变成了游离对象,没有被session关联。
2.在nofity.setClasslist(c)时候,classlist被关联到Session中成为po.
3.因为配置文件中many方设置的cascade选项是save-update,classlist会被结连更新
4.当classlist被更新的时候,由于one方设置的也是save-update,所以和classlist相互关联的notify也会被更新

如果我们把many方设置为none就可以了。

但这样又会产生问题,如果我们保存notify,Hibernate会报一个异常,提示引用了一个未保存的临时对象。

解决的方法可以是每次都保存one的那边.

java 代码
  1. Session session = factory.openSession();   
  2.     Transaction tx= session.beginTransaction();   
  3.     Classlist c = new Classlist();   
  4.     Notify notify =  new Notify();   
  5.   
  6.     c.getNotify().add(notify);   
  7.     notify.setClasslist(c);   
  8.     session.save(c);   
  9.     tx.commit();   
  10.     session.close();  
sql 代码
  1. insert into classlist (className) values (?)   
  2. insert into notify (title, content, accessory, postDate, classlist_id, role_id, notify_type) values (?, ?, ?, ?, ?, ?, 'com.talent.domain.Notify')  

 

 

分享到:
评论

相关推荐

    Open_CASCADE学习笔记-曲面建模

    ### Open_CASCADE学习笔记-曲面建模:深入解析 #### 开源三维建模软件Open_CASCADE中的曲面建模技术 Open_CASCADE是一款强大的开源三维几何建模软件,其核心功能之一便是曲面建模。本文将详细介绍Open_CASCADE在...

    Open_CASCADE学习笔记-句柄1

    第 1 节 句柄类的结构让我们开始讲句柄 (handle) 的第一篇文章,假如你想要在Open CASCADE 上开发软件的话,这篇文章虽然比较简单但是非常重要

    Open_CASCADE学习笔记-拓扑和几何.pdf

    大神Roman Lygin写的,介绍Opencascade拓扑结构实现与几何描述的文章,相当经典,论述深入,是难得的好文章。

    matlab基于笔记本电脑的摄像头的人脸检测

    MATLAB作为一个强大的数学计算和编程环境,提供了丰富的图像处理和计算机视觉工具箱,使得实时人脸检测成为可能。 首先,我们需要理解人脸识别的基本原理。人脸识别通常涉及几个关键步骤:预处理、特征提取和匹配。...

    Oracle 10g 学习笔记

    这个笔记是学习oracle数据库过程中整理出来的,比较详细,适合于初学者。 │ oracle与tomcat端口冲突.txt │ Oracle学习笔记.pdf │ Oracle学习笔记.wps │ 安装Oracle后myEclipse不能正常使用.txt │ 手工配置...

    韩顺平玩转Oracle实战教程笔记

    * 删除用户:需要具有 dba 权限或 drop user 的系统权限,注意如果要删除的用户已经创建了表,那么就需要在删除的时候带一个参数 cascade。 * 用户管理的综合案例:创建的新用户是没有任何权限的,需要为其指定相应...

    韩顺平玩转oracle视频教程笔记

    总的来说,韩顺平的Oracle视频教程笔记覆盖了Oracle认证、安装、基本使用、用户管理等多个关键领域,旨在提供一个全面的学习路径,帮助初学者逐步掌握Oracle数据库的精髓。通过这些知识,学习者可以有效地管理和维护...

    基于Opencv的人脸检测(采用笔记本摄像头输入)

    OpenCV,全称Open Source Computer Vision Library,是一个开源的计算机视觉库,它包含了各种图像处理和计算机视觉的算法,广泛应用于图像分析、机器学习等领域。在本教程中,我们将重点探讨如何使用OpenCV进行实时...

    orcle笔记个人笔记

    - **功能**:创建一个名为`student`的新角色。 - **授权**:`GRANT SELECT ON class TO student;` - **功能**:向`student`角色授予对`class`表的SELECT权限。 **7. 查看用户下数据表:** - **当前用户**:`...

    数据库笔记

    掌握这些基础知识是学习Oracle数据库的第一步,深入学习还包括表、索引、视图、触发器、存储过程、事务处理、备份恢复等多个方面,每个主题都值得细致研究。通过实践和学习,可以不断提升对Oracle数据库的管理和应用...

    Hibernate映射笔记

    - `<class>`:用于定义一个实体类到数据库表的映射。 - `name`:实体类的全限定名。 - `table`:对应数据库表的名称。 - `<id>`:表示主键映射。 - `name`:实体类中的主键属性名。 - `column`:数据库表中对应...

    hibernate 学习笔记3

    其基本模型可概括为一个主键(PO1)对应多个子项(PO2)。在映射文件中,我们使用`onetomany`和`manytoone`关键字来定义这种关系,并通过集合(如`Set`)来存储多个关联实体。 #### 映射示例: ```xml ...

    oracle笔记

    `system`用户则是一个管理操作员,拥有`sysoper`角色,但不具备创建数据库的权限,其默认密码是`manager`。 2. **Oracle的基本使用**:在Oracle中,`sql*plus`是一个强大的命令行工具,用于执行SQL查询和数据库管理...

    Python OpenCV利用笔记本摄像头实现人脸检测.pdf

    OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它包含了众多图像处理和计算机视觉的算法。 首先,要开始这个项目,你需要安装OpenCV。在Python环境中,你可以通过pip来安装OpenCV。在...

    Hibernate3.2学习笔记

    `cascade`策略决定当一个对象被操作时,是否也影响其关联的对象,如`save-update`、`delete`等。 最后,优化Hibernate的性能至关重要。开启`show_sql`可以在控制台打印出执行的SQL语句,方便调试。另外,可以使用二...

    传智播客JPA学习笔记修改免积分版

    - **非特定产品的标准化框架**: JPA 作为一种规范,并不是一个具体的实现产品,而是定义了一套标准,允许开发者在不同的持久化层之间灵活切换而不需修改业务逻辑代码。 - **降低耦合度**: 使用 JPA 开发的应用程序...

    Hibernate数据关联技术笔记

    5. FetchType和Cascade:可以设置`FetchType`来控制关联对象的加载策略,以及`Cascade`来决定操作的级联方式,如删除一个实体时是否也删除与其关联的实体。 理解并熟练运用这些关联技术,能够帮助开发者更好地设计...

    韩顺平oracle笔记(免费)

    #### 一、Oracle认证及与其他数据库的比较 - **Oracle认证**:Oracle提供了多种级别的认证体系,包括OCA(Oracle Certified Associate)、OCP(Oracle Certified Professional)、OCM(Oracle Certified Master)等...

Global site tag (gtag.js) - Google Analytics