Hibernate 关联映射之集合映射

本文介绍Hibernate框架中五种集合映射方式:set、list、bag、map及array的基本语法和配置示例,涵盖级联操作、逆向关联等概念。

Hibernate的关联映射包括:

一对一(Persion - IDCard)

一对多(Department - Employee)

多对一(Employee - Department)

多对多(Teacher - Student)

组件映射(User - Name)

集合映射(Set、List、Map)

inverse和cascade(Employee - Department)

 

本文以集合映射为例:

集合映射包括:set、list、array、bag、map

 

一、set

语法:

		<set name="" access="" batch-size="" cascade="" catalog=""
			 check="" collection-type="" embed-xml="true" fetch="join"
			 inverse="false" lazy="true" mutable="true" node=""
			 optimistic-lock="true" order-by="" outer-join="true"
			 persister="" schema="" sort="unsorted" subselect=""
			 table="" where="">
				 <cache usage="read-only" include="all" region=""/>
				 <comment></comment>
				 <composite-element class="" node=""></composite-element>
				 <element />
				 <filter name=""></filter>
				 <key></key>
				 <loader query-ref=""/>
				 <many-to-any id-type="" meta-type="">f</many-to-any>
				 <many-to-many></many-to-many>
				 <meta attribute=""></meta>
				 <one-to-many/>
				 <sql-delete></sql-delete>
				 <sql-delete-all></sql-delete-all>
				 <sql-insert></sql-insert>
				 <sql-update></sql-update>
				 <subselect></subselect>
				 <synchronize table=""/>
		</set>

其中:

1、cascade配置级联关系。用来说明当对主对象进行某种操作时是否自动对其关联的从对象也做操作,cascade值包括:

none,all,save-update,delete,lock,refresh,evict,replicate,persist,merge,delete-orphan。

缺省情况下是不做级联操作的。一般对多对一、多对多不设置级联,在一对一、一对多中设置级联。

2、inverse表示是否要放弃维护关联关系。在一对多和多对多的时候,两边是都可以维护关联关系的,为避免重复操作数据库,可以选择一边放弃维护关联关系。

inverse不能在有序的集合中使用,也就是说不能在list、array中使用。

inverse只在集合元素中可以使用,因为只有集合元素中才涉及到对象间的关联关系。

 

 例子:Department.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.cos.entity">
	<class name="Department">		
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name" column="name"/>
		<set name="emps">
			<key column="dept_id"/>
			<one-to-many class="Employee"/>
		</set>
	</class>
</hibernate-mapping>

其中:

set标签中的name是Department.java中的一对多字段empt,代表Employee.java这个对象

key中的column值代表映射到<one-to-many>标标签中对象的数据库的字段

one-to-many代表一对多所映射的对象

 

二、list

语法:

		<list name="" access="" batch-size="" cascade="" catalog="" check=""
			  collection-type="" embed-xml="true" fetch="join" inverse="false"
			  lazy="true" mutable="true" node="" optimistic-lock="true" 
			  outer-join="true" persister="" schema="" subselect="" table=""
			  where="">
				  	<cache usage="read-only"/>
				  	<comment></comment>
				  	<composite-element class=""></composite-element>
				  	<element></element>
				  	<filter name=""></filter>
				  	<index></index>
				  	<key></key>
				  	<list-index></list-index>
				  	<loader query-ref=""/>
				  	<many-to-any id-type=""></many-to-any>
				  	<many-to-many></many-to-many>
				  	<meta attribute=""></meta>
				  	<one-to-many/>
				  	<sql-delete></sql-delete>
				  	<sql-delete-all></sql-delete-all>
				  	<sql-insert></sql-insert>
				  	<sql-update></sql-update>
				  	<subselect></subselect>
				  	<synchronize table=""/>
		</list>

例子:Department.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.cos.entity">
	<class name="Department">		
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name" column="name"/>
		<!--  set name="emps">
			<key column="dept_id"/>
			<one-to-many class="Employee"/>
		</set> -->
		<list name="emps">
			<key column="dept_id"/>
			<list-index column="order_id"/>
			<one-to-many class="Employee"/>
		</list>
	</class>
</hibernate-mapping>

 其中list标签中的name值是Department对象中的属性,一对多属性。

key中的column属性是一对多表中的字段,和本表中的id对应

list-index标签是记录加入list中的顺序。

one-to-many标签的class值是一对多中的多对象。

 

三、bag

语法:

		<bag name="" access="" batch-size="" cascade="" catalog="" check=""
			  collection-type="" embed-xml="true" fetch="join" inverse="false"
			  lazy="true" mutable="true" node="" optimistic-lock="true" 
			  outer-join="true" persister="" schema="" subselect="" table=""
			  where="">
					<cache usage="read-only"/>
				  	<comment></comment>
				  	<composite-element class=""></composite-element>
				  	<element></element>
				  	<filter name=""></filter>
				  	<key></key>
				  	<loader query-ref=""/>
				  	<many-to-any id-type=""></many-to-any>
				  	<many-to-many></many-to-many>
				  	<meta attribute=""></meta>
				  	<one-to-many/>
				  	<sql-delete></sql-delete>
				  	<sql-delete-all></sql-delete-all>
				  	<sql-insert></sql-insert>
				  	<sql-update></sql-update>
				  	<subselect></subselect>
				  	<synchronize table=""/>
		</bag>

 例子:Department.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.cos.entity">
	<class name="Department">		
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name" column="name"/>
		<bag name="emps">
			<key column="dept_id"/>
			<one-to-many class="Employee"/>
		</bag>
	</class>
</hibernate-mapping>

 其中:

bag标签要与list集合对应,name属性是一对多的属性,是Department对象中的属性。 

key标签的column属性是Employee对象中的数据库字段值

one-to-many标签是一对多中的多对象

bag必须和list集合对应,跟list标签的区别是bag没有顺序,list有顺序。

 

四、map

语法:

		<map name="" access="" batch-size="" cascade="" catalog="" check=""  
      		 collection-type="" embed-xml="true" fetch="join" inverse="false"  
      		 lazy="true" mutable="true" node="" optimistic-lock="true"    
      		 outer-join="true" persister="" schema="" subselect="" table=""  
      		 where="">
      		 	<cache usage="read-only"/>  
	            <comment></comment>  
	            <composite-element class=""></composite-element>  
	            <composite-index class=""></composite-index>
	            <composite-map-key class=""></composite-map-key>
	            <element></element>  
	            <filter name=""></filter>  
	            <index></index>
	            <index-many-to-any id-type=""></index-many-to-any>
	            <index-many-to-many class=""></index-many-to-many>
	            <key></key>  
	            <loader query-ref=""/>  
	            <many-to-any id-type=""></many-to-any>  
	            <many-to-many></many-to-many>  
	            <map-key></map-key>
	            <map-key-many-to-many></map-key-many-to-many>
	            <meta attribute=""></meta>  
	            <one-to-many/>  
	            <sql-delete></sql-delete>  
	            <sql-delete-all></sql-delete-all>  
	            <sql-insert></sql-insert>  
	            <sql-update></sql-update>  
	            <subselect></subselect>  
	            <synchronize table=""/>    
		</map>

例子:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.cos.entity">
	<class name="Department">		
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name" unique="true" />
		<map name="emps">
			<key column="dept_id"/>
			<map-key type="string" column="key_"/>
			<one-to-many class="Employee"/>
		</map>
	</class>
</hibernate-mapping>

其中:

map标签说明的是一对多用的是map,name是Department中的属性。

key中的clumn是Employee中的字段

map-key说明此map的key定义。

one-to-many定义了一对多中的多字段。

 

五、数组 array

 

六、总结

使用Hibernate的时候,如果用到集合,绝大多数用set(配置简单)

现在Hibernate项目中一般很好使用关联关系和继承关系。

当前,全球经济格局深刻调整,数字化浪潮席卷各行各业,智能物流作为现代物流发展的必然趋势和关键支撑,正迎来前所未有的发展机遇。以人工智能、物联网、大数据、云计算、区块链等前沿信息技术的快速迭代与深度融合为驱动,智能物流不再是传统物流的简单技术叠加,而是正在经历一场从自动化向智能化、从被动响应向主动预测、从信息孤岛向全面互联的深刻变革。展望2025年,智能物流系统将不再局限于提升效率、降低成本的基本目标,而是要构建一个感知更全面、决策更精准、执行更高效、协同更顺畅的智慧运行体系。这要求我们必须超越传统思维定式,以系统化、前瞻性的视角,全面规划和实施智能物流系统的建设。本实施方案正是基于对行业发展趋势的深刻洞察和对未来需求的精准把握而制定。我们的核心目标在于:通过构建一个集成了先进感知技术、大数据分析引擎、智能决策算法和高效协同平台的综合智能物流系统,实现物流全链路的可视化、透明化和智能化管理。这不仅是技术层面的革新,更是管理模式和服务能力的全面提升。本方案旨在明确系统建设的战略方向、关键任务、技术路径和实施步骤,确保通过系统化部署,有效应对日益复杂的供应链环境,提升整体物流韧性,优化资源配置效率,降低运营成本,并最终为客户创造更卓越的价值体验。我们致力于通过本方案的实施,引领智能物流迈向更高水平,为构建现代化经济体系、推动高质量发展提供强有力的物流保障。
电源题电赛单相并网离网软件硬件锁相环单极性双极性调制等代码及仿真环路计算资料+原理图PCB内容概要:本文档是一份关于电力电子与能源系统仿真研究的技术资料集合,涵盖单相并网/离网系统、软件与硬件锁相环设计、单极性与双极性调制技术、虚拟同步机控制建模、P2G-CCS耦合系统、微电网优化调度、光伏风电联合运行、储能配置及需求响应等多个电力系统核心主题。文档提供了大量基于Matlab/Simulink的代码实现与仿真模型,包括LLC谐振变换器小信号分析、永磁同步电机控制、DC-AC变换器设计、光伏阵列故障仿真、直流微电网建模等,并附有原理图与PCB设计资源。同时整合了智能优化算法(如遗传算法、粒子群、灰狼优化器)、机器学习模型(如LSTM、CNN-GRU-Attention)在负荷预测、故障诊断、路径规划等领域的应用案例,形成一个跨学科的科研资源包。; 适合人群:电气工程、自动化、能源系统及相关专业的研究生、科研人员以及从事电力电子、微电网、新能源控制方向的工程师;具备Matlab/Simulink编程基础和一定电力系统理论知识者更佳。; 使用场景及目标:① 支持电赛或科研项目中对并网逆变器、锁相环、调制策略的设计与验证;② 用于复现高水平论文(如EI/SCI)中的优化调度、控制算法与仿真模型;③ 辅助开展微电网能量管理、储能配置、需求响应策略等课题的研究与代码开发;④ 提供可直接调用的算法模板与仿真平台,提升科研效率。; 阅读建议:建议按照文档结构逐步浏览,优先下载并整理网盘中的完整资源包,结合具体研究方向选取对应代码与模型进行调试与二次开发;对于复杂算法(如NSGA-II、ADMM、MPC),应配合文献理解其数学原理后再实施仿真;关注其中“论文复现”类内容以提升学术研究规范性与技术深度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值