hibernate学习笔记(三)

本文详细介绍了Hibernate中不同关系类型的映射方法,包括一对多、多对一及多对多的关系映射配置,并探讨了cascade、inverse、lazy等关键属性的作用。
java 代码
  1. 一、many-to-one关系在数据库中如何体现,在JavaBean中如何体现,在Hibernate中如何映射many-to-one关系。   
  2.   
  3. 1、数据库中:一个表的主健对应另一个表的外健。    
  4. 2、javaBean中:一个对象包含另一个对象的一个引用,另一个对象包含这个对象的一组(集合,用set)引用。    
  5. 3、在hibernate中:用set.key指定具体列。    
  6. 我们以订单Order(一方)和订单项Item(多方)为例:   
  7.   
  8. a、Order.hbm.xml的写法:    
  9. <class name="Order" table="ec_order">    
  10. <id name="id" column="id" type="integer">    
  11. <generator class="native" />    
  12. </id>    
  13. <property name="owner" column="owner" type="string" />    
  14. <property name="phone" column="phone" type="string" />    
  15. <property name="address" column="address" type="string" />    
  16. <set name="items" cascade="all-delete-orphan" inverse="true">    
  17. <key column="orderid" />    
  18. <one-to-many class="Item" />    
  19. </set>    
  20. </class>    
  21. 注:inverse=“true”表示忽略集合一端的变化。    
  22. cascade="all-delete-orphan":这个比较麻烦一点,我们先来看看把cascade设为all的情况:在我们调用session.delete(order)时,会删除order下所有的item,但是如果调用order.getItems().remove(item),然后调用session.update(order)则不会删除此item,只会把 ec_item表中该条item记录的order_id设置为null。因此,如果想通过order.getItems.remove(item)删除对象,需要在已有级联的基础上加上“delete-orphan”。   
  23.   
  24. b、Item.hbm.xml的写法    
  25. <class name="Item" table="ec_item">    
  26. <id name="id" column="id" type="integer">    
  27. <generator class="native" />    
  28. </id>    
  29. <property name="product" column="product" type="string" />    
  30. <property name="amount" column="amount" type="integer" />    
  31. <many-to-one name="order" class="Order" column="orderid"/>    
  32. </class>   
  33.   
  34. inverse="true"就是在设置如果在内存中的修改或添加了这个集合中的某一个或某几个对象他不会将全部集合的信息同步到数据库,    
  35. 而是只将集合中被修改的对象重新同步到数据库。   
  36.   
  37. cascade属性是设置级联操作的也就是在操作一端的数据如果影响到多端数据时会进行级联操作,    
  38. cascade="none",cascade="save-update",cascade="delete",cascade="all" cascade="persist"    
  39. cascade="delete-orphan",cascade属性的值常用的设置为以上五项:   
  40.   
  41. none就是不使用级联操作,默认级联是none。   
  42.   
  43. save-update也就是只有对象保存操作(持久化操作)或者是持久化对象的更新操作,才会级联操作关联对象(子对象)。   
  44.   
  45. persist就只是将级联对象也持久化到数据库。   
  46.   
  47. delete对持久化对象的删除操作时会进行级联操作关联对象(子对象)。   
  48.   
  49. all对持久化对象的所有操作都会级联操作关联对象(子对象)。   
  50.   
  51. all-delete-orphan,在多端进行删除操作时,会再多端表中留下null空纪录,设置了级联操作为delete之会将表中表示关联的外键id置成null,    
  52. 不会将这条纪录也删除掉,而把级联设置成delete-orphan就不会留有空纪录,而是级联的把相关纪录删除掉。   
  53.   
  54. batch-size这个属性只能够写在set标签中,这个属性带表批量加载,也就是在加载一端的集合属性时会一次加载指定的数量的对象,    
  55. 而不是默认的一个一个的加载,会提高效率,批量加载只能用于延迟加载和立即加载策略,也就是(lazy="true"或者lazy="false")。   
  56.   
  57. lazy="true" 延迟加载,所谓的延迟加载,就是对一端的集合属性的加载策略,就是在不使用到集合中的对象的数据就不会真正的加载集合    
  58. 中的对象数据,而是家在一个代理对象就相当于的一个空的容器。这也就是会出现LazyInitializationException异常,也就是没有初始化    
  59. 这个代理的集合对象,在事先查询到了集合中的对象就会初始化这个对象,如果Session没有关闭就会在查询加载集合中的对象信息,如果    
  60. 提前关闭了Session,当使用集合中的对象信息时就会有这个异常。   
  61.   
  62. fetch="join",这就是使用了预先抓取策略,也就是针对关联的对象的加载策略,在使用到关联对象的信息时会再发送sql语句,如果不使    
  63. 用fetch="join",就会不使用表连接而是先查出一端的关联id再一条一条的发送sql语句查询到关联对象信息,使用了fetch="join"就会使    
  64. 用表连接将关联对象信息直接查寻出来的。fetch="lazy"这个是默认的设置。   
  65.   
  66. 注意:    
  67. 在使用fetch="join"要区分开他和外连接的区别,他不会忽略配置文件中的加载策略,而使用了外连接就会忽略配置文件中使用了外连接的    
  68. 一端的所有加载策略,而替之为立即加载。   
  69.   
  70. 例:班级 tream,身份证 Certigicate 学生 student    
  71. 身份证和学生是一对一关系,班级和学生是一对多的关系。学生对身份证的加载策略是预先抓取,学生对班级是预先抓取,但是班级对学生    
  72. 是延迟加载。   
  73.   
  74. 现在使用了外连接    
  75. Query q=session.createQuery("from Student as s left join s.team");    
  76. as 的语法是取别名的语法。    
  77. 也就是使用了外连接的来查寻班级,这样就会忽略,学生对象对其所有属性除了使用外连接查寻的属性,而其余都会使用立即加载。   
  78.   
  79. <property name="" column="" type="" not-null="true">,这样也就会使这个属性不能够为空值   
  80.   
  81. 查询对象,可以使用get()和load()方法,不过前提是必须知道该对象持久化时的唯一标识,也就是id,和这个对象的类对象。   
  82.   
  83. 二、多对多的映射实现(many-to-many)   
  84.   
  85. 一般多对多关联会拆分成两个一对多的关系来实现多对多关系,也可以通过hibernate提供的解决方案来实现。其实hibernate的实现方式是通过中间表间接的实现了多对多关系,实际上也是将多对多拆分成两个双向的一对多关系。    
  86. 多对多关系XML文件的配置    
  87. <hibernate-mapping>    
  88. <class name="Course" table="course">    
  89. <set name="clazz" table="class_course" inverse="true"><!--设置中间表的表名-->    
  90. <key column="courseid">    
  91. <many-to-many column="classid" class="Clazz"/>    
  92. </set>    
  93. </class>    
  94. </hibernate-mapping>   
  95.   
  96. <hibernate-mapping>    
  97. <class name="Clazz" table="class">    
  98. <set name="course" table="class_course" cascade="save-update">    
  99. <key column="classid"/>    
  100. <many-to-many column="courseid" class="Course"/>    
  101. </set>    
  102. </class>    
  103. </hibernate-mapping>   
  104.   
  105. Hibernate知识点小记   
  106.   
  107. 一、cascade    
  108. cascade属性是设置级联操作的也就是在操作一端的数据如果影响到多端数据时会进行级联操作,一对一的时候直接写在标签上,其他的要写在set标签上    
  109. cascade="none|save-update|all|all-delete-orphan"    
  110. none 就是不使用级联操作,默认级联是none。    
  111. save-update 也就是只有对象保存操作(持久化操作)或者是持久化对象的更新操作,才会级联操作关联对象(子对象)。    
  112. all 对持久化对象的所有操作都会级联操作关联对象(子对象)。    
  113. all-delete-orphan,在多端进行删除操作时,会再多端表中留下null空纪录,设置了级联操作为delete之会将表中表示关联的外键id置成null,不会将这条纪录也删除掉,而把级联设置成delete-orphan就不会留有空纪录,而是级联的把相关纪录删除掉。   
  114.   
  115. 二、inverse    
  116. inverse="true"就是在设置如果在内存中的修改或添加了这个集合中的某一个或某几个对象他不会将全部集合的信息同步到数据库,而是只将集合中被修改的对象重新同步到数据库   
  117.   
  118. 三、lazy    
  119. lazy=“true”    
  120. 延迟加载,所谓的延迟加载,就是对一端的集合属性的加载策略,就是在不使用到集合中的对象的数据就不会真正的加载集合中的对象数据,而是家在一个代理对象就相当于的一个空的容器。    
  121. 这也就是会出现LazyInitializationException异常,也就是没有初始化这个代理的集合对象,在事先查询到了集合中的对象就会初始化这个对象,如果Session没有关闭就会在查询加载集合中的对象信息,如果提前关闭了Session,当使用集合中的对象信息时就会有这个异常。   
  122.   
  123. 四、fetch    
  124. fetch=“join”,这就是使用了预先抓取策略,也就是针对关联的对象的加载策略,在使用到关联对象的信息时会再发送sql语句,如果不使用fetch=“join”,就会不使用表连接而是先查出一端的关联id再一条一条的发送sql语句查询到关联对象信息,使用了fetch=“join”就会使用表连接将关联对象信息直接查寻出来的。fetch=“lazy”这个是默认的设置。   
  125.   
  126. 五、多对多    
  127. 写配置文件的时候要紧记一个原则就不会错了:    
  128. <key column =””>总是和本身类的主键id对应    
  129. <column=””>总是和关联类的主键id相对应   
  130.   
  131. 比如:    
  132. <set name="courses" table="enrollments " inverse="true" cascade="save-update">    
  133. <key column="sid"/>    
  134. <many-to-many class="Course" column="cid" />    
  135. </set>   
  136.     
采用PyQt5框架与Python编程语言构建图书信息管理平台 本项目基于Python编程环境,结合PyQt5图形界面开发库,设计实现了一套完整的图书信息管理解决方案。该系统主要面向图书馆、书店等机构的日常运营需求,通过模块化设计实现了图书信息的标准化管理流程。 系统架构采用典型的层设计模式,包含数据存储层、业务逻辑层和用户界面层。数据持久化方案支持SQLite轻量级数据库与MySQL企业级数据库的双重配置选项,通过统一的数据库操作接口实现数据存取隔离。在数据建模方面,设计了包含图书基本信息、读者档案、借阅记录等核心数据实体,各实体间通过主外键约束建立关联关系。 核心功能模块包含六大子系统: 1. 图书编目管理:支持国际标准书号、中国图书馆分类法等专业元数据的规范化著录,提供批量导入与单条录入两种数据采集方式 2. 库存动态监控:实时追踪在架数量、借出状态、预约队列等流通指标,设置库存预警阈值自动提醒补货 3. 读者服务管理:建立完整的读者信用评价体系,记录借阅历史与违规行为,实施差异化借阅权限管理 4. 流通业务处理:涵盖借书登记、归还处理、续借申请、逾期计算等标准业务流程,支持射频识别技术设备集成 5. 统计报表生成:按日/月/年周期自动生成流通统计、热门图书排行、读者活跃度等多维度分析图表 6. 系统维护配置:提供用户权限分级管理、数据备份恢复、操作日志审计等管理功能 在技术实现层面,界面设计遵循Material Design设计规范,采用QSS样式表实现视觉定制化。通过信号槽机制实现前后端数据双向绑定,运用多线程处理技术保障界面响应流畅度。数据验证机制包含前端格式校验与后端业务规则双重保障,关键操作均设有二次确认流程。 该系统适用于中小型图书管理场景,通过可扩展的插件架构支持功能模块的灵活组合。开发过程中特别注重代码的可维护性,采用面向对象编程范式实现高内聚低耦合的组件设计,为后续功能迭代奠定技术基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值