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项目中一般很好使用关联关系和继承关系。

【论文复现】一种基于价格弹性矩阵的居民峰谷分时电价激励策略【需求响应】(Matlab代码实现)内容概要:本文介绍了一种基于价格弹性矩阵的居民峰谷分时电价激励策略,旨在通过需求响应机制优化电力系统的负荷分布。该研究利用Matlab进行代码实现,构建了居民用电行为与电价变动之间的价格弹性模型,通过分析不同时间段电价调整对用户用电习惯的影响,设计合理的峰谷电价方案,引导用户错峰用电,从而实现电网负荷的削峰填谷,提升电力系统运行效率与稳定性。文中详细阐述了价格弹性矩阵的构建方法、优化目标函数的设计以及求解算法的实现过程,并通过仿真验证了所提策略的有效性。; 适合人群:具备一定电力系统基础知识和Matlab编程能力,从事需求响应、电价机制研究或智能电网优化等相关领域的科研人员及研究生。; 使用场景及目标:①研究居民用电行为对电价变化的响应特性;②设计并仿真基于价格弹性矩阵的峰谷分时电价激励策略;③实现需求响应下的电力负荷优化调度;④为电力公司制定科学合理的电价政策提供理论支持和技术工具。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,深入理解价格弹性建模与优化求解过程,同时可参考文中方法拓展至其他需求响应场景,如工业用户、商业楼宇等,进一步提升研究的广度与深度。
针对TC275微控制器平台,基于AUTOSAR标准的引导加载程序实现方案 本方案详细阐述了一种专为英飞凌TC275系列微控制器设计的引导加载系统。该系统严格遵循汽车开放系统架构(AUTOSAR)规范进行开发,旨在实现可靠的应用程序刷写与启动管理功能。 核心设计严格遵循AUTOSAR分层软件架构。基础软件模块(BSW)的配置与管理完全符合标准要求,确保了与不同AUTOSAR兼容工具链及软件组件的无缝集成。引导加载程序本身作为独立的软件实体,实现了与上层应用软件的完全解耦,其功能涵盖启动阶段的硬件初始化、完整性校验、程序跳转逻辑以及通过指定通信接口(如CAN或以太网)接收和验证新软件数据包。 在具体实现层面,工程代码重点处理了TC275芯片特有的多核架构与内存映射机制。代码包含了对所有必要外设驱动(如Flash存储器驱动、通信控制器驱动)的初始化与抽象层封装,并设计了严谨的故障安全机制与回滚策略,以确保在软件更新过程中出现意外中断时,系统能够恢复到已知的稳定状态。整个引导流程的设计充分考虑了时序确定性、资源占用优化以及功能安全相关需求,为汽车电子控制单元的固件维护与升级提供了符合行业标准的底层支持。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值